我在每个表上都有很少的属性,如CreatedDate,ModifiedDate,VersionNo。每次修改实体时,我都需要更改/添加这些属性的值。我以为我可以用这些属性创建一个Base类,并让Entities派生自这个Base类,在基于ObjectState的SavingChanges中,我可以更改Values和Save,这样我的审计条目就会从实体中分离出来抽象。但由于我是Entity Framework的新手,我发现很难理解如何处理映射等等。
如果有人可以提出实施此建议的想法,那将非常有帮助。 存储库代码如下所示:
public class GeneralRepository<T> : IRepository<T> where T : class
{
private ObjectSet<T> _set;
private ObjectContext _context;
public GeneralRepository(ObjectContext context)
{
if (context == null) throw new ArgumentNullException("context");
_context = context; // sets the context
_set = context.CreateObjectSet<T>(); // returns the Object Set
}
#region Methods to override to work with ObjectGraphs .
/// <summary>
/// To insert data from entity into a table.
/// </summary>
/// <param name="entity"></param>
public virtual void Insert(T entity)
{
if (entity == null) throw new ArgumentNullException("entity");
_set.AddObject(entity);
}
/// <summary>
/// To delete entity from a table.
/// </summary>
/// <param name="entity"></param>
public virtual void Delete(T entity)
{
if (entity == null) throw new ArgumentNullException("entity");
_set.Attach(entity);
_set.DeleteObject(entity);
}
/// <summary>
/// To update Entity into the table
/// </summary>
/// <param name="entity"></param>
public virtual void Update(T entity)
{
if (entity == null) throw new ArgumentNullException("entity");
_set.Attach(entity);
_context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
}
/// <summary>
/// To get th entire table contents
/// </summary>
/// <returns></returns>
public IQueryable<T> GetAll()
{
return _set;
}
}
答案 0 :(得分:7)
如果您首先使用数据库,则可以随时编辑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中执行,但这是因为单个实体从另一个实体继承),那么我们希望实体从MyBaseClass继承。
现在,当您保存它时,它将重新生成所有实体,并且它们将立即从MyBaseClass继承。就这么简单。
答案 1 :(得分:1)
我认为你是在正确的方面,创建一个名为“EntityBase”的基类或任何适合你偏好的名称,并添加这些属性。
然后我将上面的存储库类声明代码更改为:
public class GeneralRepository<T> : IRepository<T> where T : EntityBase
然后,您将能够在存储库中的所需位置设置公共属性。
就映射而言,我肯定会看到Entity Framework 5 Power Tools,因为你已经提到过你是数据库的第一个,但我的经验总是使用流畅的API进行映射。
另外......肯定会看到DBContext为您提供的一些好处,而不是您当前在存储库中使用的ObjectContext。
由于
答案 2 :(得分:0)
创建一个像BaseEntity这样的基类,并在该类中包含所需的属性。从BaseEntity派生您的实体并定义您的存储库,如下所示:
public class GeneralRepository<T> : IRepository<T> where T : BaseEntity
对于映射,有3种变体:每个层次结构的表,每个类型的表和每个混凝土类型的表。您可以在Msdn中找到有关它们的信息。
如果您有大多数不相关的实体,我会使用每个具体类型的表格,并通过调用ToTable("Apples")
类(Fluent API)中的EntityTypeConfiguration
为每个实体创建单独的表格。