我正在将一个大型数据模型从旧的Microsoft数据访问库转换为Entity Framework 4.我想将这两种方法“注入”到大多数(如果不是全部)已经生成的实体中。现有数据库进入我的EF模型:
public bool Deleted
{
get { return this.EntityState == System.Data.EntityState.Deleted; }
set
{
if (value)
Context.DeleteObject(this);
}
}
public bool Inserted
{
get { return this.EntityState == System.Data.EntityState.Added; }
set
{
if (value)
Context.AddObject(this.GetType().Name, this);
}
}
不是为每个实体创建一个部分类(超过100个),将这些方法添加到模型中的所有实体的更好方法是什么?
提前感谢您的建议。
答案 0 :(得分:4)
我会修改EF T4模板以自动生成这些属性。
答案 1 :(得分:3)
扩展@ Daz(有点稀疏)答案:右键单击设计器并选择Add Code Generation Item...
,然后选择ADO.NET Entity Object Generator.
它将创建一个模板,生成与编译器已创建的代码完全相同的代码,然后你可以自定义。打开它,很容易看到如何修改它。它的设计完全符合您的描述。
Here's a recent MSDN article详细描述了一些事情。
答案 2 :(得分:0)
为您的实体创建一个新的基类,它应该继承您正在使用的当前基类,并使用该代码扩展其成员。
答案 3 :(得分:0)
扩展方法可以解决问题。但当然它们是方法,而不是像你在样本中所做的那样适当的属性(扩展属性在框架中还不存在,只有扩展方法)。
public static class EntityObjectExtensions
{
public static bool IsDeleted(this EntityObject obj)
{
return obj.EntityState == System.Data.EntityState.Deleted;
}
public static bool Delete(this EntityObject obj)
{
Context.DeleteObject(obj);
}
public static bool IsInserted(this EntityObject obj)
{
return obj.EntityState == System.Data.EntityState.Added;
}
public static bool Insert(this EntityObject obj)
{
Context.AddObject(obj.GetType().Name, obj);
}
}
毫无疑问,这个解决方案是最优雅的,也是最接近您需求的解决方案。无需触摸代码生成,也无需在所有类上复制相同的代码。如果必须在这些方法中发展,那么更改将在一个地方完成,所有课程都将从中受益。