2011-05-12 28 views
1

我正在将大型数据模型从旧的Microsoft数据访问库转换为实体框架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

添加到公共实体基类? – 2011-05-12 05:47:30

+0

@Mitch,谢谢你的建议。我已经尝试为EntityObject添加一个部分类,但显然EntityObject没有看到一个EntityState属性。 – 2011-05-12 19:34:21

回答

4

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

0

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

+0

代码生成功能不太好。 – 2011-05-12 06:07:38

+0

彼得的正确。我希望这种行为在代码生成之外,或者想要修改代码生成来获得这些属性。 – 2011-05-12 19:17:28

3

在@ Daz的(稍微稀疏)回答:右键单击设计器,然后选择Add Code Generation Item...,然后ADO.NET Entity Object Generator.它将创建一个模板,以生成与编译器已创建的代码完全相同的代码,然后您可以自定义代码。打开它,很容易看到如何修改它。它的设计完全符合你所描述的目的。

Here's a recent MSDN article详细描述事情。

+0

@达斯,谢谢你的建议。我希望在代码生成器之外做到这一点。我认为可以开发一个方面或扩展方法来将这种行为添加到类中。但如果没有其他解决方案出现,我可能会修改代码。 – 2011-05-12 19:19:28

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

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

+0

感谢您的回复。我在寻找的是让所有实体自动使用属性的方法,所以我不必修改成千上万行客户端代码中的每一个引用。 – 2011-05-26 04:26:34

+0

@John正是我从你的问题中了解到的。我的回答不满足这个要求吗? – Ssithra 2011-05-26 08:59:58

+0

您的解决方案创建方法。为了尽量减少对客户端代码的更改,我一直在寻找属性包装器。您提供了* a *解决方案,但没有一个允许我使用现有客户端代码的解决方案。 – 2011-05-27 00:17:48

相关问题