如何在 entity framework 中使用数据库优先方法使用存储库模式

How to use Repository pattern using Database first approach in entity framework

如何在实体中使用数据库优先方法使用存储库模式 framework.I 在浏览 Internet 上可用的资源时有了一些想法,但对于实时应用程序,我不确定如何在自动生成的 [= =17=] 来自数据库优先方法。

我已经浏览了 SO 中的一些链接,但我没有弄清楚 idea.I 是这个链接的新手。 提前致谢。

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

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

2) 也可以将数据注解和实体配置处理到一个Configuration文件中,只是要谨慎,因为在某些情况下它们可能会发生冲突。在片段下方:

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

我一直在使用这种方法,老实说,我建议您像我一样将您的实现转移到代码优先方法。在我个人看来,当设计师决定创建重复键或不正确更新 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();
        }
    }

界面非常简单:

    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();
    }

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

希望对你有所帮助,
卡洛斯