首页 > 解决方案 > 复合键、EF6 和插入顺序

问题描述

我对 EF6 和复合键有疑问。假设我有一个类 (TableInBetween),它有一个由两个外键(ClassA 和 ClassB 的主键)组成的复合键。为了在数据库中插入几个这样的 TableInBetweens,我需要确保 ClassA 和 ClassB 已被插入并获得主键的值。EF6 似乎很难弄清楚这一点,并尝试插入 ClassAId = 0 和/或 ClassBId = 0 的所有 TableInBetween 对象。最简单的解决方案是首先通过调用 SaveChanges() 插入所有 ClassAs 和 B,然后创建重用现有的 TableInBetween数据库 ID。但是,这是一个经典的脏解决方案,对于出于任何原因需要进行批量插入的情况可能不是一个选择。

所以,问题是:在尝试保存 TableInBetween 之前,如何指示 ClassA 和 ClassB 需要设置一个主 ID?

[Table("CLASSA")]
public class ClassA
{
    [Column("ID"), Key]
    public int Id {get; set;}
    .
    .
    .

    public ICollection<TableInBetween> InBetweens { get; set; }
}

[Table("CLASSB")]
public class ClassB
{
    [Column("ID"), Key]
    public int Id {get; set;}
    .
    .
    .

    public ICollection<TableInBetween> InBetweens { get; set; }
}

[Table("TABLE_IN_BETWEEN")]
public class TableInBetween
{
    [Column("CLASS_A_ID", Order = 1), Key]
    public int ClassAId {get; set;}

    [Column("CLASS_B_ID", Order = 2), Key]
    public int ClassBId {get; set;}

    .
    .
    .

    [ForeignKey("ClassAId")]
    public virtual ClassA ClassA {get; set;}

    [ForeignKey("ClassBId")]
    public virtual ClassB ClassB {get; set;}    
}

重要提示:看起来取决于模型,这有时可能会在没有明确做某事的情况下工作。似乎 EF 正在为某些模型整理它,但不是为其他模型。

标签: c#databaseentity-framework

解决方案


推荐阅读