c# - 在数据库优先方法中为 Entity Framework 5 中的所有实体创建基类

标签 c# entity-framework

我在每个表上都有一些属性,例如 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/

相关文章:

c# - 将多个来源合并到一个目的地

c# - 与 EF Core 联合返回无法转换集合操作,因为两个操作数具有不同的 'Include' 操作

c# - 无法在 C# 中解析日期时间

c# - 如何使用 ajax 调用将 formcollection 传递给一个 Action ?

c# - 使用 Entity Framework 在运行时连接到Sqlite数据库

mysql - Mysql Provider 的 Ado.net Entity Framework 中的多个数据库

c# - 使用 ServiceStack HttpResult : how to specify a file name for downloaded content? 下载文件

c# - 在 Amazon Linux 上安装 mono 时出错

c# - Entity Framework 返回不同的记录问题

c# - DbMigrator - 详细的代码优先迁移