繁体   English   中英

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

[英]What's the most efficient way to inject behavior into all my entities?

我正在将大型数据模型从旧的Microsoft数据访问库转换为Entity Framework4。我想将这两种方法“注入”从现有数据库生成的大多数(如果不是全部)实体中我的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个)创建局部类,不如将这些方法添加到模型中的所有实体的更好方法是什么?

预先感谢您的建议。

我将修改EF T4模板以自动生成这些属性。

扩展@Daz的答案(有点稀疏):在设计器中单击鼠标右键,然后选择Add Code Generation Item... ,然后选择ADO.NET Entity Object Generator. 它将创建一个模板,该模板生成与编译器已经创建的代码完全相同的代码,然后您可以对其进行自定义。 打开它,很容易看到如何修改它。 专为您描述的目的而设计。

这是最近的MSDN文章 ,详细介绍了这些内容。

为您的实体创建一个新的基类,它应该继承当前使用的基类,并使用该代码扩展其成员。

扩展方法可以解决问题。 但是,它们当然是方法 ,不是您在样本中所做的适当的属性(扩展属性在框架中尚不存在,只有扩展方法)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM