C# EF6不总是生成FK引用

C# EF6不总是生成FK引用,c#,entity-framework,C#,Entity Framework,我使用的是实体框架6,当我对数据库中的模式进行反向工程时,我发现没有生成几个FK关系。它快把我逼疯了。如果我手动添加它们,则在尝试插入时会出现密钥冲突错误。把它们拿出来,一切正常 模式: 当我查看我的RemarketingCase对象时,我没有看到任何地址、债务人或票据的集合,也没有提及资产或摘要。然而,当我查看任一状态对象时,我有一个RecordHistory/CaseShistory的ICollection。我查看了两个历史记录表中的任何一个,我都参考了Status表,但没有参考Remark

我使用的是实体框架6,当我对数据库中的模式进行反向工程时,我发现没有生成几个FK关系。它快把我逼疯了。如果我手动添加它们,则在尝试插入时会出现密钥冲突错误。把它们拿出来,一切正常

模式:

当我查看我的RemarketingCase对象时,我没有看到任何地址、债务人或票据的集合,也没有提及资产或摘要。然而,当我查看任一状态对象时,我有一个RecordHistory/CaseShistory的ICollection。我查看了两个历史记录表中的任何一个,我都参考了Status表,但没有参考RemarketingCase表

这真的很烦人,因为我正试图处理根本不存在的对象图!它迫使我处理RemarketingCase的添加及其所有关系,一次添加一个,顺序正确,这样SQL就不会出现引用完整性错误

带有FK参考的样本(由EF生成):

公共部分类状态
{
公众地位()
{
this.casehistors=新列表();
}
公共int Id{get;set;}
公共字符串标题{get;set;}
公共字符串说明{get;set;}
公共虚拟ICollection案例历史记录{get;set;}
}
公共类状态映射:EntityTypeConfiguration
{
公共状态映射()
{
//主键
this.HasKey(t=>t.Id);
//性质
this.Property(t=>t.Title)
.IsRequired()
.IsFixedLength()
.HasMaxLength(15);
this.Property(t=>t.Description)
.IsRequired()
.HasMaxLength(50);
//表和列映射
本表为可更改的(“状态”);
this.Property(t=>t.Id).HasColumnName(“Id”);
this.Property(t=>t.Title).HasColumnName(“Title”);
this.Property(t=>t.Description).HasColumnName(“Description”);
}
}
EF生成的无FK参考的样本:

public partial class Status
{
    public Status()
    {
        this.CaseHistories = new List<CaseHistory>();
    }

    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public virtual ICollection<CaseHistory> CaseHistories { get; set; }
}
public class StatusMap : EntityTypeConfiguration<Status>
{
    public StatusMap()
    {
        // Primary Key
        this.HasKey(t => t.Id);

        // Properties
        this.Property(t => t.Title)
            .IsRequired()
            .IsFixedLength()
            .HasMaxLength(15);

        this.Property(t => t.Description)
            .IsRequired()
            .HasMaxLength(50);

        // Table & Column Mappings
        this.ToTable("Status");
        this.Property(t => t.Id).HasColumnName("Id");
        this.Property(t => t.Title).HasColumnName("Title");
        this.Property(t => t.Description).HasColumnName("Description");
    }
}
public partial class RemarketingCase
{
    public int LoanId { get; set; }
    public int RequestId { get; set; }
    public string VIN { get; set; }
    public int RemarketingCaseId { get; set; }
    public string CaseId { get; set; }
    public string CaseNumber { get; set; }
    public string AssetId { get; set; }
    public System.DateTime Created { get; set; }
    public string CreatedBy { get; set; }
    public Nullable<System.DateTime> Updated { get; set; }
    public string UpdatedBy { get; set; }
}
public class RemarketingCaseMap : EntityTypeConfiguration<RemarketingCase>
{
    public RemarketingCaseMap()
    {
        // Primary Key
        this.HasKey(t => new { t.LoanId, t.RequestId, t.VIN });

        // Properties
        this.Property(t => t.LoanId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        this.Property(t => t.RequestId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

        this.Property(t => t.VIN)
            .IsRequired()
            .HasMaxLength(25);

        this.Property(t => t.RemarketingCaseId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        this.Property(t => t.CaseId)
            .HasMaxLength(50);

        this.Property(t => t.CaseNumber)
            .HasMaxLength(50);

        this.Property(t => t.AssetId)
            .HasMaxLength(50);

        this.Property(t => t.CreatedBy)
            .IsRequired()
            .HasMaxLength(50);

        this.Property(t => t.UpdatedBy)
            .HasMaxLength(50);

        // Table & Column Mappings
        this.ToTable("RemarketingCase");
        this.Property(t => t.LoanId).HasColumnName("LoanId");
        this.Property(t => t.RequestId).HasColumnName("RequestId");
        this.Property(t => t.VIN).HasColumnName("VIN");
        this.Property(t => t.RemarketingCaseId).HasColumnName("RemarketingCaseId");
        this.Property(t => t.CaseId).HasColumnName("CaseId");
        this.Property(t => t.CaseNumber).HasColumnName("CaseNumber");
        this.Property(t => t.AssetId).HasColumnName("AssetId");
        this.Property(t => t.Created).HasColumnName("Created");
        this.Property(t => t.CreatedBy).HasColumnName("CreatedBy");
        this.Property(t => t.Updated).HasColumnName("Updated");
        this.Property(t => t.UpdatedBy).HasColumnName("UpdatedBy");
    }
}
公共部分类重新营销案例
{
public int LoanId{get;set;}
public int RequestId{get;set;}
公共字符串VIN{get;set;}
public int remarkingCaseId{get;set;}
公共字符串CaseId{get;set;}
公共字符串CaseNumber{get;set;}
公共字符串AssetId{get;set;}
public System.DateTime已创建{get;set;}
通过{get;set;}创建的公共字符串
公共可空更新的{get;set;}
由{get;set;}更新的公共字符串
}
公共类RemarketingCaseMap:EntityTypeConfiguration
{
公共再营销案例图()
{
//主键
this.HasKey(t=>new{t.LoanId,t.RequestId,t.VIN});
//性质
this.Property(t=>t.LoanId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
this.Property(t=>t.RequestId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
this.Property(t=>t.VIN)
.IsRequired()
.HasMaxLength(25);
this.Property(t=>t.remarkingCaseId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
this.Property(t=>t.CaseId)
.HasMaxLength(50);
this.Property(t=>t.CaseNumber)
.HasMaxLength(50);
this.Property(t=>t.AssetId)
.HasMaxLength(50);
this.Property(t=>t.CreatedBy)
.IsRequired()
.HasMaxLength(50);
this.Property(t=>t.updateBy)
.HasMaxLength(50);
//表和列映射
本表为ToTable(“再销售案例”);
this.Property(t=>t.LoanId).HasColumnName(“LoanId”);
this.Property(t=>t.RequestId).HasColumnName(“RequestId”);
this.Property(t=>t.VIN).HasColumnName(“VIN”);
this.Property(t=>t.remarkingCaseId).HasColumnName(“remarkingCaseId”);
this.Property(t=>t.CaseId).HasColumnName(“CaseId”);
this.Property(t=>t.CaseNumber).HasColumnName(“CaseNumber”);
this.Property(t=>t.AssetId).HasColumnName(“AssetId”);
this.Property(t=>t.Created).HasColumnName(“Created”);
this.Property(t=>t.CreatedBy).HasColumnName(“CreatedBy”);
this.Property(t=>t.Updated).HasColumnName(“Updated”);
this.Property(t=>t.UpdatedBy).HasColumnName(“UpdatedBy”);
}
}
手动添加参考的示例:

public partial class RemarketingCase
{
    public RemarketingCase()
    {
        this.Addresses = new List<Address>();
        this.Debtors = new List<Debtor>();
        this.Notes = new List<Note>();
        this.RecordHistories = new List<RecordHistory>();
        this.CaseHistories = new List<CaseHistory>();
    }

    public int LoanId { get; set; }
    public int RequestId { get; set; }
    public string VIN { get; set; }
    public int RemarketingCaseId { get; set; }
    public string CaseId { get; set; }
    public string CaseNumber { get; set; }
    public string AssetId { get; set; }
    public System.DateTime Created { get; set; }
    public string CreatedBy { get; set; }
    public Nullable<System.DateTime> Updated { get; set; }
    public string UpdatedBy { get; set; }
    // manually added...
    public virtual ICollection<Address> Addresses { get; set; }
    public virtual ICollection<Debtor> Debtors { get; set; }
    public virtual ICollection<Note> Notes { get; set; }
    public virtual ICollection<RecordHistory> RecordHistories { get; set; }
    public virtual ICollection<CaseHistory> CaseHistories { get; set; }
    public virtual Asset Asset { get; set; }
    public virtual Summary Summary { get; set; }
}
公共部分类重新营销案例
{
公众再营销案例()
{
this.Addresses=新列表();
this.Debtors=新列表();
this.Notes=新列表();
this.RecordHistories=新列表();
this.casehistors=新列表();
}
public int LoanId{get;set;}
public int RequestId{get;set;}
公共字符串VIN{get;set;}
public int remarkingCaseId{get;set;}
公共字符串CaseId{get;set;}
公共字符串CaseNumber{get;set;}
公共字符串AssetId{get;set;}
public System.DateTime已创建{get;set;}
通过{get;set;}创建的公共字符串
公共可空更新的{get;set;}
由{get;set;}更新的公共字符串
//手动添加。。。
公共虚拟ICollection地址{get;set;}
公共虚拟ICollection债务人{get;set;}
公共虚拟ICollection注释{get;set;}
公共虚拟ICollection记录历史记录{get;set;}
公共虚拟ICollection案例历史记录{get;set;}
公共虚拟资产{get;set;}
公共虚拟摘要{get;set;}
}
这是我手动添加FKs时得到的错误:

测试方法AutoPay.Test.Remarketing.DatabaseChange.InsertAsset 异常:System.Data.Entity.Infrastructure.DbUpdateException:一个 更新条目时出错。有关详细信息,请参见内部异常 详情。-->System.Data.Entity.Core.UpdateException:错误 更新条目时发生。硒