如何在实体框架中使用数据库优先的方法使用存储库模式。我得到了一些想法,而通过互联网上可用的资源,但对于实时应用程序,我不确定如何实现存储库模式上的自动生成的类从数据库第一的方法。
我已经通过了一些链接在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);
}
}
我正在使用这种方法,老实说,我建议你像我一样将你的实现转移到代码优先的方法。在我个人看来,当设计师决定创建重复的键或不正确地更新XML文件时,维护和修复问题是一件痛苦的事情,因为这种情况不止一次发生在我身上。好消息是,您可以避免迁移和Code First使用的一些特性,并保持DB结构的原样。一切都可以配置。如果你感兴趣的话,我可以告诉你更多。
无论如何,我还附加了一个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();
}
将接口应用于您创建的部分类,以扩展数据库第一类,您将能够在存储库中查询这些实体。您还可以向存储库接口添加Properties,使这些属性可见,并添加使用常见属性(如Id、名称等)进行搜索的常见功能(如果适用)。
我希望它有帮助,
卡洛斯