我的实体报价定义为:
public class Quote
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid QuoteId { get; set; }
public virtual ApplicationUser Owner { get; set; }
public int? InitialInfoId { get; set; }
public virtual InitialInfo InitialInfo { get; set; }
public virtual ICollection<InitialInfo> InitialInfoCollection { get; set; }
}
这个想法是,当更改InitialInfo实体时,旧版本仍保留在集合中,现在可以通过InitialInfo属性获得新版本。
InitialInfo实体定义如下(为简洁起见,删除了属性)。
public class InitialInfo
{
public int InitialInfoId { get; set; }
public Guid QuoteId { get; set; }
public virtual Quote Quote { get; set; }
}
运行OnModelCreating时,我将Fluent关系设置为:
modelBuilder.Entity<Quote>()
.HasOptional(x => x.InitialInfo)
.WithMany()
.HasForeignKey(x => x.InitialInfoId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<InitialInfo>()
.HasRequired(x => x.Quote)
.WithMany(x => x.InitialInfoCollection)
.HasForeignKey(x => x.QuoteId);
Seed方法执行以下操作以确保1:0..1&amp; 1:许多:
protected override void Seed(MyDbContext context)
{
context.Database.ExecuteSqlCommand("ALTER TABLE Quotes ADD CONSTRAINT uc_InitialInfo UNIQUE(InitialInfoId)");
}
这导致以下设置。
问题是,当EF与数据库一起使用时,为了更新InitialInfo,不推断FK,必须手动设置,否则会引发有关违反FK约束的错误,例如:
quote.InitialInfo = new InitialInfo() { QuoteId = quote.QuoteId };
是否必须手动设置FK“正确”的方式,或者我没有理解某些内容?