Entity framework 4 无法在对象';dbo.User'\r\n语句已终止

Entity framework 4 无法在对象';dbo.User'\r\n语句已终止,entity-framework-4,Entity Framework 4,我有一个用户表。对于CreatedBy等字段,存在来自其他表的对此表的引用 问题是,当我插入另一个表的一行(比如“x”)时,它试图将新用户插入到用户表中 它应该做的是将CreatedBy作为现有用户插入到表“x”中 使用实体框架4。以前有人遇到过这样的问题吗?您可以将实体与相关实体一起插入,也可以不插入相关实体而插入实体,只引用现有实体。这取决于您编写的代码 例1: User-User=getuserfromwhere(); 使用(var context=new MyContext()) { 订

我有一个用户表。对于CreatedBy等字段,存在来自其他表的对此表的引用

问题是,当我插入另一个表的一行(比如“x”)时,它试图将新用户插入到用户表中

它应该做的是将CreatedBy作为现有用户插入到表“x”中


使用实体框架4。以前有人遇到过这样的问题吗?

您可以将实体与相关实体一起插入,也可以不插入相关实体而插入实体,只引用现有实体。这取决于您编写的代码

例1:

User-User=getuserfromwhere();
使用(var context=new MyContext())
{
订单=新订单();
order.CreatedBy=用户;
context.Orders.AddObject(order);
//将订单和相关实体用户都置于添加状态
//因为用户未附加到上下文
SaveChanges();
//创建新订单和新用户,并设置它们之间的关系
}
例2:

使用(var context=new MyContext())
{
User=context.Users.SingleOrDefault(u=>u.Id==1);
//查询将此用户附加到此上下文
//用户现在处于未更改的状态
订单=新订单();
order.CreatedBy=用户;
context.Orders.AddObject(order);
//将使订单进入添加状态,但不触及
//已连接的相关实体的状态->用户保留
//状态不变
SaveChanges();
//参照用户创建新订单,但不创建新用户
}
例3:

User-User=getuserfromwhere();
使用(var context=new MyContext())
{
context.Users.Attach(用户);
//我们明确地依附于上下文
//我们知道这个用户存在于数据库中
//用户现在处于未更改的状态
订单=新订单();
order.CreatedBy=用户;
context.Orders.AddObject(order);
//将使订单进入添加状态,但不触及
//已连接的相关实体的状态->用户保留
//状态不变
SaveChanges();
//参照用户创建新订单,但不创建新用户
}
编辑

例4:

int userId=GetUserIdFromSomewhere();
使用(var context=new MyContext())
{
var user=新用户{Id=userId};
//我们使用正确的主键创建存根用户实体
//不必设置其他属性
//仅将关系设置为订单
context.Users.Attach(用户);
//我们明确地依附于上下文
//我们知道这个用户存在于数据库中
//用户现在处于未更改的状态
订单=新订单();
order.CreatedBy=用户;
context.Orders.AddObject(order);
//将使订单进入添加状态,但不触及
//已连接的相关实体的状态->用户保留
//状态不变
SaveChanges();
//参照用户创建新订单,但不创建新用户
}

我的问题演绎得很好。只是我已经在做例子3了。唯一的区别是,不是通过GetUserFromSomeWhere()获取用户;我正在将用户对象作为参数传递。。。通过WCF线。。。所以我失去了背景。这导致实体框架也插入了用户对象。因为它不知道它已经存在了。我必须从客户端发送ID,并根据服务器端的ID获取用户。或者我必须在模型中包含外键列。。。所以我可以这样做。。。order.CreatedBy.Id=Id@Nilotpal:
GetUserFromSomeWhere()
某种程度上是对WCF服务的模拟,或者通常是您的
user
实体与您在其中进行修改的上下文分离。使用外键属性通常是一个好主意。或者,您也可以使用“存根”用户实体并将其附加到上下文:
var user=new user{Id=userId};context.Users.Attach(用户)。对于
Attach
,设置主键属性非常重要。当您只想设置与订单的关系时,其他属性可能仍为空。请参见上面“我的编辑”部分中的示例4。@Slauma-+1。很好的例子。相关问题: