我在 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 会将其作为新添加的对象进行跟踪。有几种选择:
-
从数据库上下文加载 Item1 并使用它来分配订单实例中的属性,这让 EF 知道实体已保留在 tbe 数据库中。
-
显式将 Item1 标记为"未更改/已分离",以便 EF 跳过它。
ctx.Entry(order.Item).State = System.Data.Entity.EntityState.Unchanged;