我正在将EF core 2与现有数据库一起使用。使用 Scaffold-DbContext 命令对类进行逆向工程。这工作正常。甚至Fluent API也通过正确的数据库字段约束等,例如
. . . .
modelBuilder.Entity<FsReport>(entity =>
{
entity.Property(e => e.Bcclist)
.IsUnicode(false)
.HasDefaultValueSql("('')");
entity.Property(e => e.Cclist)
.IsUnicode(false)
.HasDefaultValueSql("('')");
. . . .
问题是对于 1 个字段,我需要添加自定义数据注释。如果我添加它,那么一旦我重新运行 Scaffold-DbContext -force 命令(例如,如果数据库模式更改(,那么注释将被覆盖并删除。
我能做些什么来避免这种情况?我尝试将其放在同名的不同分部类中,但得到了"该类型已包含以下定义......错误'
非常感谢任何帮助。
我也有类似的情况,我想根据"我的控制之外"数据库更改重新生成脚手架并维护我的自定义DbContext
编辑。我通过对生成的DbContext
进行子类化来解决此问题(此处将其称为ScaffoldDbContext
(。在子类(称为ScaffoldNavigationDbContext
(中,我在对modelBuilder
进行自定义编辑之前调用base.OnModelCreating
。
基架代码将实体类生成为部分类,因此我利用并在类中引入这些导航属性。与基架生成的类分开。例如,下面是我的代码,它将"幸存"新的脚手架一代。这可能有一些警告,但我不知道它们,对于我的简单用例,它可以工作。
public partial class ScaffoldNavigationDbContext : ScaffoldDbContext {
public ScaffoldNavigationDbContext (DbContextOptions options) : base(options) { }
protected override void OnModelCreating(ModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<CertMaster>(entity => {
entity.HasMany(x => x.CertTrans).WithOne(x => x.CertMaster).HasPrincipalKey(x => x.CertId);
});
}
}
public partial class CertMaster {
public List<CertTrans> CertTrans{ get; set; }
}
public partial class CertTrans {
public CertMaster CertMaster { get; set; }
}
No.如果您坚持运行Scaffold-DbContext
(首先使用数据库(,则需要在之后重新添加更改。继续操作的最佳方法是阅读并实现实体框架核心迁移(代码优先(。