在DB第一种方法中为Entity Framework 5中的所有实体创建基类

我在每个表上都有很少的属性,如CreatedDate,ModifiedDate,VersionNo。 每次修改实体时,我都需要更改/添加这些属性的值。 我以为我可以使用这些属性创建一个Base类,并让Entities派生自这个Base类,并且在基于ObjectState的SavingChanges期间,我可以更改Values和Save,这样我的审计条目将与实体隔离,而事物将是抽象。 但由于我是Entity Framework的新手,我发现很难理解如何处理映射等等。

如果有人可以提出实施这一点的想法,那将非常有帮助。 存储库代码如下:

public class GeneralRepository : IRepository where T : class { private ObjectSet _set; private ObjectContext _context; public GeneralRepository(ObjectContext context) { if (context == null) throw new ArgumentNullException("context"); _context = context; // sets the context _set = context.CreateObjectSet(); // returns the Object Set } #region Methods to override to work with ObjectGraphs . ///  /// To insert data from entity into a table. ///  ///  public virtual void Insert(T entity) { if (entity == null) throw new ArgumentNullException("entity"); _set.AddObject(entity); } ///  /// To delete entity from a table. ///  ///  public virtual void Delete(T entity) { if (entity == null) throw new ArgumentNullException("entity"); _set.Attach(entity); _set.DeleteObject(entity); } ///  /// To update Entity into the table ///  ///  public virtual void Update(T entity) { if (entity == null) throw new ArgumentNullException("entity"); _set.Attach(entity); _context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified); } ///  /// To get th entire table contents ///  ///  public IQueryable GetAll() { return _set; } 

}

如果您首先使用数据库,则可以随时编辑T4模板以执行所需操作。 在解决方案资源管理器中,展开MyEntities.edmx文件并找到MyEntities.tt文件并将其打开。

在307行,你应该有以下方法:

 public string EntityClassOpening(EntityType entity) { return string.Format( CultureInfo.InvariantCulture, "{0} {1}partial class {2}{3}", Accessibility.ForType(entity), _code.SpaceAfter(_code.AbstractOption(entity)), _code.Escape(entity), _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType))); } 

您需要将其更改为:

 public string EntityClassOpening(EntityType entity) { return string.Format( CultureInfo.InvariantCulture, "{0} {1}partial class {2}{3}", Accessibility.ForType(entity), _code.SpaceAfter(_code.AbstractOption(entity)), _code.Escape(entity), _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType) ?? "MyBaseClass")); } 

您可以看到,如果没有提供BaseType(您可以在GUI中执行,但这是因为单个实体从另一个实体inheritance),那么我们希望实体从MyBaseClassinheritance。

现在,当您保存它时,它将重新生成所有实体,并且它们将立即从MyBaseClassinheritance。 就那么简单。

我认为你是在正确的路线上,创建一个名为“EntityBase”的基类或任何适合你偏好的名称,并添加这些属性。

然后我将上面的存储库类声明代码更改为:

 public class GeneralRepository : IRepository where T : EntityBase 

然后,您可以在需要时在存储库中设置公共属性。

就映射而言,我肯定会看到Entity Framework 5 Power Tools,因为你已经提到过你是数据库的第一个,但我的经验总是使用流畅的API进行映射。

另外……肯定会看到DBContext为您提供的一些好处,而不是您当前在存储库中使用的ObjectContext。

谢谢

创建一个像BaseEntity这样的基类,并在该类中包含所需的属性。 从BaseEntity派生您的实体并定义您的存储库,如下所示:

 public class GeneralRepository : IRepository where T : BaseEntity 

对于映射,有3种变体:每个层次结构的表,每个类型的表和每个混凝土类型的表。 您可以在Msdn中找到有关它们的信息。

如果你有大多数不相关的实体,我会使用Table per Concrete Type,并通过在EntityTypeConfiguration类(Fluent API)中调用ToTable("Apples")为每个实体创建单独的表。