我的问题是:有没有一种方法可以使用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..
});
答案 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()可扩展性方法。你可以把它放在那里。但是,我不会这样做。它隐藏了重要的逻辑。将此代码放在存储库或类似的抽象中。我个人可能会获得该模型,然后在从存储库返回之前将数据传输到特定于应用程序的模型。然后我将它返回到存储库时将其转换回来。不是很快,但业务应用程序通常不需要我工作的毫秒速度......可维护性是至关重要的。