我想扩展Linq To Sql生成的类,以便在创建新对象(=行)时进行初始化。
我想在创建父行时向子表添加行。
我希望使用Oncreated(部分)方法做这样的事情:
partial class Product {
partial void OnCreated() {
// Fill default rows for FK relations
this.Columns.Add(new ProductColumn {
Name = "Name", ColumnType = 1
});
this.Columns.Add(new ProductColumn {
Name = "Producer", ColumnType = 2
});
}
}
每次从构造函数调用OnCreated。因此,如果在调用OnCreated之后将从数据库加载对象。如果从数据库加载对象,则不要执行代码。
那么我在哪里可以为模型添加逻辑来初始化对象(-graph)?
答案 0 :(得分:3)
在Linq to SQL生成的类中没有内置的方法。它们在从DB调用时专门调用OnLoaded,但是当它不是时它们不会调用任何东西。我怀疑因为没有办法确切地知道......
我建议使用Chris建议的工厂方法。
答案 1 :(得分:2)
使用LINQ-to-SQL,实体在很大程度上不知道父数据上下文 - 只有像EntitySet<T>
这样的延迟加载成员才知道这个细节。您可以通过查看.IsDeferred
(假设 延迟)来识别数据上下文感知实体集 - 如果涉及数据上下文则为true,否则为false - 但是还有其他问题:
OnCreated
)已执行OnCreated
/ .ctor()
中手动添加项目,则当LINQ-to-SQL尝试附加数据上下文时它会中断new()
等也将共享此代码不幸的是;不,我认为你不能以任何明智的方式在OnCreated
中做到这一点。你可以:
.Create()
方法(因为LINQ-to-SQL不会使用上述任何一种)
答案 2 :(得分:1)
我认为在这种情况下你最好使用Factory来创建你的实例;因此,您目前的任何地方都有如下代码:
Product p = new Product();
你会改为:
Product p = ProductFactory.CreateProduct();
您的CreateProduct()方法看起来像:
public Product CreateProduct()
{
var p = new Product();
p.Columns.Add(new ProductColumn {
Name = "Name", ColumnType = 1
});
p.Columns.Add(new ProductColumn {
Name = "Producer", ColumnType = 2
});
return p;
}
答案 3 :(得分:0)
如果您正在使用设计器 - 我认为您是因为使用了部分类 - 您可以在设计器中添加关联,并且相应的列将自动添加到您的对象中。 MSDN使用设计器工作界面对how to create associations进行了引用。