地图1:0..1和地图1:许多映射;外键没有推断

时间:2015-07-15 13:02:42

标签: c# entity-framework ef-code-first

我的实体报价定义为:

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)");
    }

这导致以下设置。

View from MSS SMS

问题是,当EF与数据库一起使用时,为了更新InitialInfo,不推断FK,必须手动设置,否则会引发有关违反FK约束的错误,例如:

quote.InitialInfo = new InitialInfo() { QuoteId = quote.QuoteId };

是否必须手动设置FK“正确”的方式,或者我没有理解某些内容?

0 个答案:

没有答案