gpt4 book ai didi

.net - 如何在 Entity Framework 中使用数据库优先方法使用存储库模式

转载 作者:行者123 更新时间:2023-12-04 19:58:54 24 4
gpt4 key购买 nike

如何在 Entity Framework 中使用数据库优先方法使用存储库模式。我在浏览互联网上可用的资源时得到了一些想法,但对于实时应用程序,我不确定如何在从数据库优先方法自动生成的类上实现存储库模式。

我已经浏览了 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 方法。在我个人看来,当设计人员决定创建重复的 key 或不正确地更新 XML 文件时,维护和修复问题是一件很痛苦的事情,因为它不止一次地发生在我身上。好消息是,您可以避免迁移和 Code First 使用的一些功能,并按原样保留数据库结构。一切都可以配置。如果你有兴趣,我可以告诉你更多。

无论如何,我还附上了一个简单的 GenericRepository 模式的代码片段,您可能会发现它很有用。我还将强烈建议在您的实现中使用依赖注入(inject)(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();
}

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

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

关于.net - 如何在 Entity Framework 中使用数据库优先方法使用存储库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30374791/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com