如何在实体框架中使用数据库优先方法使用存储库模式

Rak*_*das 5 .net asp.net-mvc entity-framework ef-database-first

如何在实体框架中使用数据库优先方法使用存储库模式。我在浏览Internet可用资源时有一些想法,但是对于实时应用程序,我不确定如何在数据库优先方法的自动生成类上实现存储库模式。

我已经在SO中进行了一些链接,但是我没有一个清晰的主意。提前致谢。

Cha*_*les 4

代码生成工具只会修改映射到 XML 文件的类。您有几个选择:

1) 您可以使用分部类来扩展映射的类。使用自动化工具更新代码时,部分类不会被自动化工具修改。

2)您还可以将数据注释和实体配置处理到配置文件中,但要小心,因为在某些情况下它们可能会发生冲突。下面是一个片段:

public class YourClassConfiguration : EntityTypeConfiguration<YourClass>
{
    public YourClassConfiguration()
    {
        ToTable("YourTable");
        HasKey(e => e.Property1);
        Property(e => e.Property1).HasColumnName("MyName").HasMaxLength(30);
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用这种方法,老实说,我建议您像我一样将实现转移到代码优先方法。在我个人看来,当设计者决定创建重复的键或不正确更新 XML 文件时,维护和修复问题是一件痛苦的事情,因为这种情况不止一次发生在我身上。好消息是,您可以避免迁移和 Code First 使用的一些功能,并按原样保留数据库结构。一切都可以配置。如果您有兴趣,我可以告诉您更多信息。

不管怎样,我还附上了一个 GenericRepository 模式的简单代码片段,您可能会觉得有用。我还强烈建议在您的实现中使用依赖注入(GenericRepository 模式需要解决依赖关系)。我会推荐Autofac。它非常稳定并且有很大的支持。

    public class EntityRepository<T> : IRepository<T>, IDisposable where T
                                    : class, IEntity
    {

        private readonly DbSet<T> dbset;
        private readonly DbContext _context;
        private readonly bool _lazyLoadingEnabled = true;


        public EntityRepository(DbContext context, bool lazyLoadingEnabledEnabled)
        : this(context)
        {
            _lazyLoadingEnabled = lazyLoadingEnabledEnabled;
        }

        public EntityRepository(DbContext context)
        {
            _context = context;
            _context.Configuration.LazyLoadingEnabled = _lazyLoadingEnabled;
            dbset = context.Set<T>();
        }

        public void Add(T entity)
        {
            dbset.Add(entity);
            _context.SaveChanges();
        }

        public void Update(T entity)
        {
            var originalValues = FindOne(x => x.Id == entity.Id);
            _context.Entry(originalValues).CurrentValues.SetValues(entity);
            _context.SaveChanges();
        }

        public void Remove(T entity)
        {
            dbset.Remove(entity);
            _context.SaveChanges();
        }

        public List<T> Find(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
        {
            return dbset.Where(predicate).ToList();
        }

        public T FindOne(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
        {
            return dbset.FirstOrDefault(predicate);
        }

        public List<T> FindAll()
        {
            return dbset.ToList();
        }
    }
Run Code Online (Sandbox Code Playgroud)

界面非常简单:

    public interface IRepository<T>
                    where T : class, IEntity
    {
        void Add(T entity);
        void Update(T entity);
        void Remove(T entity);
        T FindOne(Expression<Func<T, bool>> predicate);
        List<T> Find(Expression<Func<T, bool>> predicate);
        List<T> FindAll();
    }
Run Code Online (Sandbox Code Playgroud)

将接口应用到您创建的用于扩展数据库第一类的分部类,您将能够查询存储库中的这些实体。您还可以将属性添加到存储库界面,以使这些属性可见,并添加使用常见属性(例如 ID、名称等)进行搜索的常见功能(如果适用)。

我希望它有帮助,
卡洛斯