EF Core 2.2 中基数 class 的问题
Issue with base class in EF Core 2.2
我有很多 class 如下所示:
public class ModelOneConfiguration
{
public ModelOneConfiguration(EntityTypeBuilder<ModelOne> entity)
{
entity.Property(e => e.Id).IsRequired().HasDefaultValueSql("NEWID()");
entity.Property(e => e.CreatedAt).HasDefaultValueSql("getutcdate()").ValueGeneratedOnAdd();
entity.Property(e => e.UpdatedAt).HasDefaultValueSql("getutcdate()").ValueGeneratedOnUpdate();
entity.Property(e => e.FirstName).IsRequired();
entity.Property(e => e.LastName).IsRequired();
entity.Property(e => e.Email).IsRequired();
}
}
并从 Db 上下文中调用它 class:
protected override void OnModelCreating(ModelBuilder builder)
{
new ModelOneConfiguration(builder.Entity<ModelOne>());
….other classes as well…
base.OnModelCreating(builder);
}
当我迁移时它工作正常,结果如下:
Id = table.Column<Guid>(nullable: false, defaultValueSql: "NEWID()"),
CreatedAt = table.Column<DateTimeOffset>(nullable: false, defaultValueSql: "getutcdate()"),
UpdatedAt = table.Column<DateTimeOffset>(nullable: true, defaultValueSql: "getutcdate()"),
FirstName = table.Column<string>(nullable: false),
LastName = table.Column<string>(nullable: false),
Email = table.Column<string>(nullable: false)
到目前为止还不错。
现在我尝试在基础 class 中包含 Id、CreatedAt 和 UpdatedAt,这样我就可以将它与我的所有其他模型配置一起使用 classes。所以我所做的是,我正在关注 Ivan Stoev 回答的 。
所以对于我的基地 class 我做了以下
public class BaseConfiguration<TEntity> : IEntityTypeConfiguration<TEntity> where TEntity : BaseEntities
{
public virtual void Configure(EntityTypeBuilder<TEntity> entity)
{
entity.Property(e => e.Id).IsRequired().HasDefaultValueSql("NEWID()");
entity.Property(e => e.CreatedAt).HasDefaultValueSql("getutcdate()").ValueGeneratedOnAdd();
entity.Property(e => e.UpdatedAt).HasDefaultValueSql("getutcdate()").ValueGeneratedOnUpdate();
}
}
然后我扩展了我的模型配置 class:
public class ModelOneConfiguration : BaseConfiguration<ModelOne>
{
public ModelOneConfiguration(EntityTypeBuilder<ModelOne> entity)
{
entity.Property(e => e.FirstName).IsRequired();
entity.Property(e => e.LastName).IsRequired();
entity.Property(e => e.Email).IsRequired();
}
}
现在当我运行迁移时它生成以下
Id = table.Column<Guid>(nullable: false),
CreatedAt = table.Column<DateTimeOffset>(nullable: false),
UpdatedAt = table.Column<DateTimeOffset>(nullable: true),
FirstName = table.Column<string>(nullable: false),
LastName = table.Column<string>(nullable: false),
Email = table.Column<string>(nullable: false)
正如我们所见,defaultValueSql: "NEWID()"
、defaultValueSql: "getutcdate()"
只是在 Id
、CreatedAt
和 UpdatedAt
中丢失了。
我正在使用 Core 2.2 和 EF core 2.2。
我的问题很简单:
我做错了什么,如何解决?
您派生的 class 应该在 Configure
方法内部执行工作,而不是在构造函数中执行。为此添加一个 override
,并确保调用基础 Configure
方法:
public class ModelOneConfiguration : BaseConfiguration<ModelOne>
{
public override void Configure(EntityTypeBuilder<ModelOne> builder)
{
base.Configure(builder);
entity.Property(e => e.FirstName).IsRequired();
entity.Property(e => e.LastName).IsRequired();
entity.Property(e => e.Email).IsRequired();
}
}
我有很多 class 如下所示:
public class ModelOneConfiguration
{
public ModelOneConfiguration(EntityTypeBuilder<ModelOne> entity)
{
entity.Property(e => e.Id).IsRequired().HasDefaultValueSql("NEWID()");
entity.Property(e => e.CreatedAt).HasDefaultValueSql("getutcdate()").ValueGeneratedOnAdd();
entity.Property(e => e.UpdatedAt).HasDefaultValueSql("getutcdate()").ValueGeneratedOnUpdate();
entity.Property(e => e.FirstName).IsRequired();
entity.Property(e => e.LastName).IsRequired();
entity.Property(e => e.Email).IsRequired();
}
}
并从 Db 上下文中调用它 class:
protected override void OnModelCreating(ModelBuilder builder)
{
new ModelOneConfiguration(builder.Entity<ModelOne>());
….other classes as well…
base.OnModelCreating(builder);
}
当我迁移时它工作正常,结果如下:
Id = table.Column<Guid>(nullable: false, defaultValueSql: "NEWID()"),
CreatedAt = table.Column<DateTimeOffset>(nullable: false, defaultValueSql: "getutcdate()"),
UpdatedAt = table.Column<DateTimeOffset>(nullable: true, defaultValueSql: "getutcdate()"),
FirstName = table.Column<string>(nullable: false),
LastName = table.Column<string>(nullable: false),
Email = table.Column<string>(nullable: false)
到目前为止还不错。
现在我尝试在基础 class 中包含 Id、CreatedAt 和 UpdatedAt,这样我就可以将它与我的所有其他模型配置一起使用 classes。所以我所做的是,我正在关注 Ivan Stoev 回答的
所以对于我的基地 class 我做了以下
public class BaseConfiguration<TEntity> : IEntityTypeConfiguration<TEntity> where TEntity : BaseEntities
{
public virtual void Configure(EntityTypeBuilder<TEntity> entity)
{
entity.Property(e => e.Id).IsRequired().HasDefaultValueSql("NEWID()");
entity.Property(e => e.CreatedAt).HasDefaultValueSql("getutcdate()").ValueGeneratedOnAdd();
entity.Property(e => e.UpdatedAt).HasDefaultValueSql("getutcdate()").ValueGeneratedOnUpdate();
}
}
然后我扩展了我的模型配置 class:
public class ModelOneConfiguration : BaseConfiguration<ModelOne>
{
public ModelOneConfiguration(EntityTypeBuilder<ModelOne> entity)
{
entity.Property(e => e.FirstName).IsRequired();
entity.Property(e => e.LastName).IsRequired();
entity.Property(e => e.Email).IsRequired();
}
}
现在当我运行迁移时它生成以下
Id = table.Column<Guid>(nullable: false),
CreatedAt = table.Column<DateTimeOffset>(nullable: false),
UpdatedAt = table.Column<DateTimeOffset>(nullable: true),
FirstName = table.Column<string>(nullable: false),
LastName = table.Column<string>(nullable: false),
Email = table.Column<string>(nullable: false)
正如我们所见,defaultValueSql: "NEWID()"
、defaultValueSql: "getutcdate()"
只是在 Id
、CreatedAt
和 UpdatedAt
中丢失了。
我正在使用 Core 2.2 和 EF core 2.2。
我的问题很简单:
我做错了什么,如何解决?
您派生的 class 应该在 Configure
方法内部执行工作,而不是在构造函数中执行。为此添加一个 override
,并确保调用基础 Configure
方法:
public class ModelOneConfiguration : BaseConfiguration<ModelOne>
{
public override void Configure(EntityTypeBuilder<ModelOne> builder)
{
base.Configure(builder);
entity.Property(e => e.FirstName).IsRequired();
entity.Property(e => e.LastName).IsRequired();
entity.Property(e => e.Email).IsRequired();
}
}