我正在使用实体框架创建一个通用存储库。看起来像这样:
public abstract class EntityRepository<TEntity> : IEntityRepository<TEntity> where TEntity : Entity
{
protected DataContext Context { get; set; }
protected DbSet<TEntity> EntitySet { get; set; }
public EntityRepository(DataContext context)
{
this.Context = context;
this.EntitySet = context.Set<TEntity>();
}
//CRUD methods omitted for simplicity
}
那么我可以创建一个继承自这个存储库并添加一些其他功能/逻辑的存储库......
public class VariationsRepository : EntityRepository<Variation>, IVariationsRepository
问题是我正在使用代码优先方法,当我创建迁移时,数据库中不会创建任何表...我如何确保迁移为具有存储库的每个实体创建相应的表? (应用程序的所有模型都会有通用存储库的实现)
您可以通过利用上下文的覆盖来定义方法
OnModelCreating
上的每个实体。
public class YourContext : DbContext
{
public YourContext (DbContextOptions options) : base(options) { }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasKey(o => o.Id);
modelBuilder.Entity<User>()
.Property(o => o.Name)
.IsRequired()
.HasMaxLength(100);
}
}
我更喜欢以这种方式配置我的实体,而不是使用 DataAnnotation 属性。
你也可以想“好吧,但是如果我有很多实体,这个配置方法将会很大”。 在这种情况下,您可以像本文中那样分成多个类。