2017-06-17 35 views
0

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

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表达式来进行持续。

实施例之实践:

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

为什么?

回答

0

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

  1. 加载项目1从DB上下文和使用它的财产在订单实例,它可以让EF知道该实体在TBE数据库已经持续分配。

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

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

谢谢,我要去给了论文提示了一枪。 –

+0

这两个解决方案对我来说都很好,我会用第二个解决方案,因为适合我的项目。谢谢你。 –

+0

但是,当对象属性仍然具有更多的对象属性时,最好将他从上下文中再次恢复,而不是将其标记为未更改。 –

相关问题