我在每个表上都有一些属性,例如 CreatedDate、ModifiedDate、VersionNo。每次修改实体时,我都需要更改/添加这些属性的值。我想我可以用这些属性创建一个基类,让实体派生自这个基类,在基于 ObjectState 的 SavingChanges 期间,我可以更改值并保存,这样我的审计条目将与实体隔离,并且事情将是抽象。但是由于我是 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;
}
最佳答案
如果你先做数据库,你总是可以编辑 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 继承。就这么简单。
关于c# - 在数据库优先方法中为 Entity Framework 5 中的所有实体创建基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13375682/