C# 组合键、EF6和插入顺序

C# 组合键、EF6和插入顺序,c#,database,entity-framework,C#,Database,Entity Framework,我对EF6和组合键有问题。假设我有一个类(TableInBetween),它有一个由两个外键(ClassA和ClassB的主键)组成的复合键。为了在数据库中插入这些表中的几个,我需要确保已插入ClassA和ClassB,并为它们的主键获取一个值。EF6似乎很难弄清楚这一点,并尝试在ClassAId=0和/或ClassBId=0的对象之间插入所有TableInB。最简单的解决方案是,首先通过调用SaveChanges()插入所有类和B,然后创建可重用这些现有数据库ID的TableInBetween

我对EF6和组合键有问题。假设我有一个类(TableInBetween),它有一个由两个外键(ClassA和ClassB的主键)组成的复合键。为了在数据库中插入这些表中的几个,我需要确保已插入ClassA和ClassB,并为它们的主键获取一个值。EF6似乎很难弄清楚这一点,并尝试在ClassAId=0和/或ClassBId=0的对象之间插入所有TableInB。最简单的解决方案是,首先通过调用SaveChanges()插入所有类和B,然后创建可重用这些现有数据库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;}    
}
[表(“CLASSA”)]
甲级公共课
{
[列(“ID”),键]
公共int Id{get;set;}
.
.
.
在{get;set;}之间的公共ICollection
}
[表(“B类”)]
公共B类
{
[列(“ID”),键]
公共int Id{get;set;}
.
.
.
在{get;set;}之间的公共ICollection
}
[表格(“中间表格”)]
公共类表中间
{
[列(“类ID”,顺序=1),键]
公共int类援助{get;set;}
[列(“类别ID”,顺序=2),键]
公共int类bid{get;set;}
.
.
.
[外键(“ClassAId”)]
公共虚拟类a ClassA{get;set;}
[外键(“类标”)]
公共虚拟类B类B{get;set;}
}

重要提示:看起来这取决于模型,有时可能不做明确的事情。似乎EF正在为某些型号进行分类,而不是为其他型号进行分类。

您也在寻找复合键的多对多关系,为什么要将所有表和朋友都大写underscore@TheGeneral让我看看。为了回答您关于表名的问题,本例中的目标数据库是oracle,我们需要使用这种约定。@TheGeneral:谢谢!我解决了!基本上,如果您尝试批量插入东西,问题仍然存在,但这不是我的用例。也许我遗漏了什么,但至少我已经解决了数据库中的几个这样的关系的问题。我很高兴听到这个消息