Entity Framework: «Невозможно определить отношения между двумя объектами, потому что они присоединены к разным объектам ObjectContext». - PullRequest
5 голосов
/ 15 июля 2011

У меня есть этот код (VS2010 ASP.NET MVC 3 с EF 4):

Project project = new Project();
project.Number = number;
project.Name = name;
context.AddObject(project);

ProjectUser projectUser = new ProjectUser();
projectUser.User = user;
projectUser.Status = 1;
project.ProjectUsers.Add(projectUser);

context.SaveChanges(true);

Генерирует следующую ошибку (в строке "project.ProjectUsers.Add (projectUser)")

"Невозможно определить отношения между двумя объектами, поскольку они прикреплены к разным объектам ObjectContext."

Я не понимаю, почему, насколько я знаю, оба объекта используют один и тот же ObjectContext (но я новичок в EF).

Что я делаю не так? Спасибо за вашу помощь!

Ответы [ 5 ]

7 голосов
/ 15 июля 2011

Если ваша user переменная относится к типу сущности и она назначена другому контексту, вы столкнетесь с этой проблемой.

Я не думаю, что проблема между вашими Project и ProjectUser объектами, только потому, что ваш ProjectUser объект явно не назначен контексту - я думаю, что по умолчанию он перейдет в тот же контекст, что и Project когда вы идете, чтобы сохранить его.

Я полагаю, что вы получаете эту ошибку только тогда, когда у вас действительно есть два контекста и вы пытаетесь соединить их вместе.

4 голосов
/ 15 июля 2011

Просто перечислите, что вы сделали для Project, вам нужно добавить ProjectUser в контекст.Так имитируйте строку:

context.AddObject(project);

И вместо этого сделайте это

context.AddObject(projectUser);

И сделайте это, прежде чем добавить его в коллекцию на проекте.

0 голосов
/ 12 декабря 2017

Я знаю, что это стар как грязь, но я потратил несколько часов на то, что сегодня эта бесполезная ошибка была расстроена, и ответ Бабакара, наконец, направил меня в правильном направлении.

С Ninject, управляющим зависимостями, мне нужно было указать

kernel.Bind<Context>().ToSelf().InSingletonScope();

, прежде чем мои EF-вызовы между UserManager и различными контроллерами начали работать правильно.

0 голосов
/ 07 сентября 2017

Я думаю, что хорошим способом избежать этой проблемы является реализация вашего application database контекста как singleton.Вот пример для вас:

здесь ваш ApplicationDbContext.cs `java

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;
    }
}

`

здесь ваш контроллер `java

private ApplicationDbContext _db;

public class HelloController : Controller
{
    _db = ApplicationDbContext.getInstance();
}

`

так что вы можете иметь точно такой же экземпляр независимо от того, где вы находитесь в приложении

0 голосов
/ 15 июля 2011

Вам вообще не нужна эта строка:

project.ProjectUsers.Add(projectUser);

Достаточно просто добавить проект, потому что вы устанавливаете отношения.

context.AddObject(project);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...