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

Nis*_*Roy 4 c# entity-framework

我在每个表上都有很少的属性,如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;
    }
Run Code Online (Sandbox Code Playgroud)

}

Jef*_*ing 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)));
}
Run Code Online (Sandbox Code Playgroud)

您需要将其更改为:

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"));
}
Run Code Online (Sandbox Code Playgroud)

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

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