从EntityKey构造EntityObject而不在Entity Framework中进行数据库调用

时间:2009-06-15 16:59:01

标签: entity-framework

假设我在数据库中有一行我知道的特定id(在下面的示例中--Id = 5的符号),我可以创建一个EntityObject,它可以附加到另一个实体而无需加载它来自数据库(同样的情况也适用于“DeleteObject”,如果你考虑一下......)?

我尝试了以下内容:

UserSpread spread = UserSpread.CreateUserSpread(5, 500000, 1.1m, 1.5m);

EntityKey symbolKey = new EntityKey("Entities.SymbolSet", "Id", 5);

Symbol symbol = new Symbol();
symbol.EntityKey = symbolKey;

// dealingEntities.Attach(symbol);

spread.Symbol = symbol;
Entities.AddToSpreadSet(spread);

我在“AddToSpreadSet()”方法上得到以下异常:

  

“无法将对象添加到ObjectStateManager,因为它已经有一个EntityKey。使用ObjectContext.Attach附加一个具有现有密钥的对象。”

如果我在将符号分配给spread(注释行)之前尝试附加符号,我会在“SaveChanges()”方法中得到以下内容:

  

“无法附加对象,因为作为EntityKey一部分的属性的值与EntityKey中的对应值不匹配。”

任何想法?
谢谢,
尼尔

2 个答案:

答案 0 :(得分:3)

我使用的一般方法是创建一个存根实体(通过仅设置PK)并将其附加到上下文。

所以这是一个例子:

Category existing = new Category {ID = 7};
ctx.AttachTo("Categories", existing); // Notice no use of EntityKey anywhere


// build a new product
...
product.Category = existing;
ctx.AddToProducts(product);
ctx.SaveChanges();

这适用于构建关系,但删除时有一些注意事项。因此,请务必查看我的EF tips series以获取更多信息。 尤其是这一个:

Tip 9 - How to delete an object without retrieving it

希望这有帮助

亚历

答案 1 :(得分:1)

可以做你要问的事。您必须执行以下操作:

dealingEntities.symbolReference.EntityKey = new EntityKey(“Entities.SymbolSet”,“Id”,5);

这有意义吗?我可能会将您的实体名称混淆,请询问我是否需要进一步的信息。