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..
});
您可以在后期创建中完成。.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();