我在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表达式来保持持久性。
实际例子:
为什么呢?
答案 0 :(得分:1)
每次创建新的Order实例时,您似乎都使用了Item1的新实例(可能与数据库中持久记录的ID相同)。但随后EF会将其作为新添加的对象进行跟踪。有几种选择:
从db上下文加载Item1并使用它来分配订单实例中的属性,这样EF就可以知道该实体已经存在于数据库中。
将Item1标记为Unchanged / Detached,以便EF跳过它。
ctx.Entry(order.Item).State = System.Data.Entity.EntityState.Unchanged;