在EF Database First中为实体定义通用存储库

时间:2012-07-31 08:05:16

标签: entity-framework database-first

我正从CodeFirst迁移到DatabaseFirst以映射我的视图。在我的CodeFirst方法中,我有一个像这样的基本实体:

public abstract class BaseEntity
{
    /// <summary>
    /// Gets or sets the entity identifier
    /// </summary>
    public virtual int Id { get; set; }
... // Some more methods here for equality checking
}

我从这个基类派生了所有类,因为每个类都有一个Id。所以我使用这个BaseClass来创建一个通用的存储库。我的存储库看起来像这样:

public partial class EfRepository<T> where T : BaseEntity
{
    public readonly DemirbasContext context;
    private DbSet<T> _entities;

    /// <summary>
    /// Ctor
    /// </summary>
    /// <param name="context">Object context</param>
    public EfRepository(DemirbasContext context)
    {
        this.context = context;
    }

    public T GetById(object id)
    {
        return this.Entities.Find(id);
    }

    public void Insert(T entity)
    {
        try
        {
            if (entity == null)
                throw new ArgumentNullException("entity");

            this.Entities.Add(entity);

            this.context.SaveChanges();
        }
        catch (Exception e)
        {
        ...
        }
    }
    // Other methods here Update, Delete etc

所以我只能通过指定像这样的通用类型参数来创建存储库

EfRepository<Car> carRepo = new EfRepository<Car>();

在DatabaseFirst中,我无法从基类派生实体类。有没有办法做到这一点或你的建议是什么?

1 个答案:

答案 0 :(得分:0)

哎呀,我错过了代码生成器。

右键单击数据模型(.EDM文件),然后单击“添加代码生成项”。选择DbContext(用于简化的DbContext API)。

这将创建两个扩展名为.tt的文件:一个用于上下文,一个用于实体。如果展开文件,您将看到.tt文件包含您的所有类。

您可以根据需要进行修改。