加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

.net – 如何在实体框架中使用Database first方法使用Repository

发布时间:2020-12-16 09:55:12 所属栏目:asp.Net 来源:网络整理
导读:如何在实体框架中使用数据库第一种方法使用存储库模式.我在浏览互联网上可用的资源时得到了一些想法但是对于实时应用程序我不知道如何从数据库第一种方法在自动生成的类上实现存储库模式. 我已经在SO中找到了一些链接,但我没有明白任何想法.我是这个新手. 提
如何在实体框架中使用数据库第一种方法使用存储库模式.我在浏览互联网上可用的资源时得到了一些想法但是对于实时应用程序我不知道如何从数据库第一种方法在自动生成的类上实现存储库模式.

我已经在SO中找到了一些链接,但我没有明白任何想法.我是这个新手.
提前致谢.

解决方法

代码生成工具仅修改映射到 XML文件的类.你有几个选择:

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

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

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

我正在使用这种方法,老实说,我建议你像我一样将实现转移到Code First方法.在我个人看来,当设计师决定创建重复的密钥或没有正确更新XML文件时,维护和修复问题会很困难,因为它不止一次发生在我身上.好消息是,您可以避免迁移和Code First使用的一些功能,并保留DB结构.一切都可以配置.如果你有兴趣,我可以告诉你更多.

无论如何,我还附加了一个GenericRepository模式的简单代码片段,您可能会发现它很有用.我还强烈建议在实现中使用dependecy Injection(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,name等常用属性(如果适用).

我希望它有所帮助,卡洛斯

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读