Linq2Sql自定义映射

本文关键字:映射 自定义 Linq2Sql | 更新日期: 2023-09-27 18:29:15

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

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

我的实体和所有现有代码都希望Length以英尺为单位,但在数据库中,Length以米为单位存储,所以我需要进行转换。有没有一种方法可以注册回调或插入一些代码来设置对象。长度手动基于DataRow还是L2S内部检索数据?

是的,我想我可以设置"double LengthInMeters{set{Length=value*0.3048;}}",但我希望避免产生重复的属性,并引入关于使用哪个的模糊性。我想做的是用我的DataContext注册一个闭包,以便在创建产品后调用,这样我就可以说:

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

Linq2Sql自定义映射

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

与其进行创建后事件,我建议您在实例化实体时只进行转换。例如:

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