C# 为什么在保留时复制对象记录



我在 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 表达式来持久化。

实用示例:

  • 我在 LocalDB 上很好地保留了类 Item1;
  • 然后我尝试保留一个具有属性 Item1 的类 Order1
  • 当持久化 Order1 时,它们在本地数据库上创建另一条记录作为 Item1(克隆?(,而不仅仅是引用已经持久化的 Item1;
  • 最后,我卡住了两个 Item1 在 LocalDB 上。

为什么?

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

  1. 从数据库上下文加载 Item1 并使用它来分配订单实例中的属性,这让 EF 知道实体已保留在 tbe 数据库中。

  2. 显式将 Item1 标记为"未更改/已分离",以便 EF 跳过它。

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

最新更新