Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架外键插入重复键_Entity Framework_Insert_Foreign Keys_Duplicates - Fatal编程技术网

Entity framework 实体框架外键插入重复键

Entity framework 实体框架外键插入重复键,entity-framework,insert,foreign-keys,duplicates,Entity Framework,Insert,Foreign Keys,Duplicates,我有一个代码优先的EF模型,如下所示: public partial class A { [Key] [StringLength(7)] public string Code { get; set; } [Required] [StringLength(100)] public string Name { get; set; } public virtual ICollection<B> Bs { get; set; }

我有一个代码优先的EF模型,如下所示:

public partial class A
{
    [Key]
    [StringLength(7)]
    public string Code { get; set; }

    [Required]
    [StringLength(100)]
    public string Name { get; set; }


    public virtual ICollection<B> Bs { get; set; }
}

public partial class B
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    [StringLength(100)]
    public string Name { get; set; }

    [Required]
    [StringLength(7)]
    [ForeignKey("A")]
    public string ACode { get; set; }

    public virtual A A { get; set; }
}
var a = new A();
a.Code = "A0";
a.Name = "A Name";

var b = new B();
b.Name = "B Name";
b.ACode = a.Code;
b.A = a;

using (DbContext context = new DbContext())
{
        context.As.Add(a);
        context.Bs.Add(b);
        context.SaveChanges();
}

var b2 = new B();
b2.Name = "B Name 2";
b2.ACode = a.Code;
b2.A = a;

using (DbContext context = new DbContext())
{
        context.Bs.Add(b2);
        context.SaveChanges();
}
我在第一次
上下文中没有问题。保存更改
。但当我尝试用相同的
ACode
和引用添加b2时,我得到了

违反主键约束“PK_dbo.As”。无法在对象“dbo.As”中插入重复键。重复的键值为(A0)

我真的很困惑,所以如果有人能解释为什么在第二次调用
context.SaveChanges()
时,EF试图插入新的实体而不是使用现有的实体,我会非常高兴


非常感谢您的帮助

感谢King King的评论,我发现了两件事

首先,如果只分配了外键Id(而不是引用),我可以自动找到外键

而不是

var b2 = new B();
b2.Name = "B Name 2";
b2.ACode = a.Code;
b2.A = a;
第二,当您分配引用时,必须使用context.As.Attach(a)在context.Bs.Add(b2)之前附加引用对象


非常感谢king king您的帖子对我帮助很大。

第一次保存更改后,A有一个Id值。由于在第二次调用中再次隐式添加相同的对象,因此会出现异常。您应该保持上下文打开或将A的状态设置为“已修改”。A没有Id,密钥应为代码。每当我想将实体B添加到数据库时,我不能有相同的上下文。我希望能够在任何时候将实体B添加到A,而不仅仅是在我将实体A插入数据库时。第二个上下文不了解
A
,它假设应该添加
A
,因此是例外。好的,我如何让第二个上下文知道
A
是一个引用。如果我用
int-Id
替换
string-code
,它将自动工作
查看它是否有效。
var b2 = new B();
b2.Name = "B Name 2";
b2.ACode = a.Code;
b2.A = a;