C# 实体框架:;无法定义这两个对象之间的关系,因为它们附加到不同的ObjectContext对象;
我有以下代码(VS2010 ASP.NET MVC 3和EF 4): 它生成以下错误(在“project.ProjectUsers.Add(projectUser)”行上) “无法定义两个对象之间的关系,因为它们附加到不同的ObjectContext对象。” 我不明白为什么,据我所知,这两个对象都使用相同的ObjectContext(但我对EF是新手) 我做错了什么?C# 实体框架:;无法定义这两个对象之间的关系,因为它们附加到不同的ObjectContext对象;,c#,entity-framework,C#,Entity Framework,我有以下代码(VS2010 ASP.NET MVC 3和EF 4): 它生成以下错误(在“project.ProjectUsers.Add(projectUser)”行上) “无法定义两个对象之间的关系,因为它们附加到不同的ObjectContext对象。” 我不明白为什么,据我所知,这两个对象都使用相同的ObjectContext(但我对EF是新手) 我做错了什么? 谢谢你的帮助 仅列出您为Project所做的工作,您需要将ProjectUser添加到上下文中。所以模仿这句话: context
谢谢你的帮助 仅列出您为Project所做的工作,您需要将ProjectUser添加到上下文中。所以模仿这句话:
context.AddObject(project);
而是让它
context.AddObject(projectUser);
并在将其添加到project上的集合之前执行此操作。您根本不需要这一行:
project.ProjectUsers.Add(projectUser);
仅仅添加项目就足够了,因为您正在设置关系
context.AddObject(project);
如果您的
用户
变量是一个实体类型,并且它被分配到不同的上下文,那么您将遇到这个问题
我不认为问题出在项目
和项目用户
对象之间,只是因为没有将项目用户
对象显式分配给上下文-我认为在默认情况下,保存它时,它将与项目
的上下文相同
我相信只有当您真正拥有两个上下文并尝试将它们连接在一起时才会出现此错误。我认为避免此问题的一个好方法是将
应用程序数据库
上下文作为单例实现。以下是一个示例:
这里是您的ApplicationDbContext.cs
`爪哇
`
因此,无论你在应用程序中的哪个位置,你都可以得到完全相同的实例。我知道这已经是老生常谈了,但今天我花了几个小时对这个毫无帮助的错误感到沮丧,巴巴卡尔的回答最终为我指明了正确的方向
使用Ninject管理依赖项时,我需要指定
kernel.Bind<Context>().ToSelf().InSingletonScope();
kernel.Bind().ToSelf().InSingletonScope();
在UserManager和各种控制器之间的EF调用开始正常运行之前。我想我真的需要这条线路。。。否则,项目和ProjectUser之间没有关系。我不明白没有那一行怎么会有关系。我试过了,但它说“具有临时EntityKey值的对象不能附加到对象上下文。”当我在“project.ProjectUsers.add(projectUser)”行之前添加“context.AddObject(projectUser)”行时。你说得对!我以为问题出在Project和ProjectUser之间,但问题确实出在User上。谢谢!
public class ApplicationDbContext : DbContext, IDbContextFactory<DbContext>
{
protected static ApplicationDbContext _instance { private set; get; }
private ApplicationDbContext() : base("ApplicationDbContext")
{
}
public DbContext Create()
{
return getInstance();
}
public static ApplicationDbContext getInstance()
{
if (_instance == null) {
_instance = new ApplicationDbContext();
}
return _instance;
}
}
private ApplicationDbContext _db;
public class HelloController : Controller
{
_db = ApplicationDbContext.getInstance();
}
kernel.Bind<Context>().ToSelf().InSingletonScope();