C#为什么在持久存在时会复制对象记录?

时间:2017-06-17 21:05:38

标签: c# linq duplicates entity-framework-6

我在C#上使用localDB,而某些类(上下文类)具有属于另一个类的属性,但是当我持久保存该对象时,他不仅保存属性类(class_id)的引用,而是再次复制整个属性类。 (坚持两者)

public class Item
{

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public String Name { get; set; }
}   

public class Order
{

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

这两个类都有一个额外的控件类,它基本上保持相同的例程:

    public void SaveObjeto(ObjectClass object)
    {
        if (object.Id == 0)
        {
            ctx.Objects.Add(objeto);
        }
        else
        {
            var temp = ctx.Objects.SingleOrDefault(
                           temp => temp.Id == objeto.Id
                       );
            temp.Id = objeto.Id;
            temp.Attribute = objeto.Attribute;
        }

        ctx.SaveChanges();
    }

我使用Linq表达式来保持持久性。

实际例子:

  • 我在ClassDB上保留了Class Item1;
  • 然后我尝试持久化具有属性Item1
  • 的Order1类
  • 当持久存在Order1时,他们在LocalDB上创建另一条记录为Item1(clone?),而不是只引用已经持久化的Item1;
  • 最后,我坚持在LocalDB上坚持使用两个Item1。

为什么呢?

1 个答案:

答案 0 :(得分:1)

每次创建新的Order实例时,您似乎都使用了Item1的新实例(可能与数据库中持久记录的ID相同)。但随后EF会将其作为新添加的对象进行跟踪。有几种选择:

  1. 从db上下文加载Item1并使用它来分配订单实例中的属性,这样EF就可以知道该实体已经存在于数据库中。

  2. 将Item1标记为Unchanged / Detached,以便EF跳过它。

    ctx.Entry(order.Item).State = System.Data.Entity.EntityState.Unchanged;