Linq2Sql自定义映射

时间:2012-03-27 20:49:22

标签: c# linq-to-sql

我的问题是:有没有一种方法可以使用DataContext / Table映射在数据库和我的实体实例的创建之间实现一些自定义映射代码?

举一个简单的例子,假设我的Products实体类具有属性“double Length {get; set;}”

我的实体和我现有的所有代码都期望长度为英尺,但在数据库中长度以米为单位存储,因此我需要进行转换。有没有办法注册回调或以其他方式插入一些代码来基于DataRow手动设置object.Length,或者数据是否由L2S内部检索?

是的,我认为我可以设置“double LengthInMeters {set {Length = value * 0.3048;}}”但我希望避免制作重复的属性并引入关于使用哪个的含糊不清。我想要做的是在创建Product之后使用我的DataContext注册一个闭包,以便我可以说:

DataContext.Entity<Product>().OnCreated( (p, row) => 
{ 
  p.Length = row["Length"] * 0.3048; 
  p.ProductCode = row["Sku"].ToString().Substring(1, 5);
 ...etc..
});

2 个答案:

答案 0 :(得分:1)

我建议您在实例化实体时进行转换,而不是进行创建后事件。例如:

var qry = from product in dc.Products
          where product == something
          select new Product()
          {
              Length = product.Length * 0.3048,
              // etc.
          };
var normalizedProduct = qry.ToList();

答案 1 :(得分:1)

您可以在帖子创建中执行此操作。 .designer.cs类包含模型的OnCreated()可扩展性方法。你可以把它放在那里。但是,我不会这样做。它隐藏了重要的逻辑。将此代码放在存储库或类似的抽象中。我个人可能会获得该模型,然后在从存储库返回之前将数据传输到特定于应用程序的模型。然后我将它返回到存储库时将其转换回来。不是很快,但业务应用程序通常不需要我工作的毫秒速度......可维护性是至关重要的。