【发布时间】:2019-02-13 13:51:45
【问题描述】:
我有很多类如下所示:
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 上下文类中调用它:
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)
到目前为止一切顺利。
现在我尝试将 Id、CreatedAt 和 UpdatedAt 包装在基类中,这样我就可以将它与我的所有其他模型配置类一起使用。所以我所做的就是关注这个example 由 Ivan Stoev 回答的问题。
所以对于我的基类我做了以下
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();
}
}
然后我扩展了我的模型配置类:
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)
我们可以看到,Id、CreatedAt 和 UpdatedAt 中缺少 defaultValueSql: "NEWID()"、defaultValueSql: "getutcdate()"。
我正在使用 Core 2.2 和 EF core 2.2。
我的问题很简单:
我做错了什么,如何解决?
【问题讨论】:
-
BaseConfiguration.Configure方法被调用了吗? -
ModelOneConfiguration类中的配置是在构造函数中完成而不是覆盖Configure方法的原因吗? -
不,这只是因为我已经接管了一个旧代码并正在努力清理它,所以欢迎任何建议
-
根据我的经验,应该这样做,也许是您的代码不起作用的原因。将该代码移到
Configure方法中,不要忘记调用base.Configure -
顺便说一句,当您在第一条评论中询问时,这不是真的我发现该方法没有像我所做的那样调用我添加 base.Configure(entity);它有效,欢迎您留下答案和任何其他我会接受的建议
标签: c# entity-framework asp.net-core-2.2 ef-core-2.2