将行为注入我所有实体的最有效方法是什么?

时间:2011-05-12 05:44:04

标签: c# entity-framework-4 extension-methods

我正在将一个大型数据模型从旧的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个),将这些方法添加到模型中的所有实体的更好方法是什么?

提前感谢您的建议。

4 个答案:

答案 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);
    }
}

毫无疑问,这个解决方案是最优雅的,也是最接近您需求的解决方案。无需触摸代码生成,也无需在所有类上复制相同的代码。如果必须在这些方法中发展,那么更改将在一个地方完成,所有课程都将从中受益。