EF 6 разделяют одну и ту же сущность между разными DbContexts?

1

Я использую ASP.NET MVC 5 с EF 6. Я пытаюсь следить за DDD patern, и у меня есть IdentityContext и AddressContext.

public class IdentityContext : IdentityDbContext<ApplicationUser>
{
    public IdentityContext()
        : base("DefaultConntection", throwIfV1Schema: false)
    {
    }

    public static IdentityContext Create()
    {
        return new IdentityContext();
    }

}

public class AddressContext: DbContext
{
    public AddressContext(): base("DefaultConntection"){}

    public DbSet<Location> Locations { get; set; }
}

Когда я пытаюсь расширить (добавить-перенаправить и обновить-базу данных) свой ApplicationUser, который принадлежит IdentityContext, я получаю "Уже есть объект с именем" Locations "в базе данных".

public class ApplicationUser : IdentityUser
{
    public virtual Nullable<int> LocationId { get; set; }

    public virtual Location Location { get; set; }
}

Как я могу совместно использовать объект определения местоположения между IdentityContext и AddressContext?

Любая помощь будет оценена по достоинству.

Теги:
entity-framework
asp.net-mvc
domain-driven-design

1 ответ

1
Лучший ответ

Решение состояло бы в том, чтобы иметь один контекст, содержащий все ваши DbSets, а затем просто использовать это для обновления вашей базы данных (и ничего больше), а затем отключить инициализацию базы данных для каждого из других контекстов. Вы можете сделать это, установив его в конструкторе своих бизнес-контекстов :. Пример:

public class IdentityContext : IdentityDbContext<ApplicationUser>
{
        public IdentityContext()
            : base("DefaultConntection", throwIfV1Schema: false)
    {
        Database.SetInitializer<IdentityContext>(null);
    }

    public static IdentityContext Create()
    {
        return new IdentityContext();
    }

}

public class AddressContext: DbContext
{
    public AddressContext(): base("DefaultConntection")
    {
        Database.SetInitializer<AddressContext>(null);
    }

    public DbSet<Location> Locations { get; set; }
}


public class MigrationContext:IdentityDbContext<ApplicationUser>
{
        public MigrationContext()
        : base("DefaultConntection", throwIfV1Schema: false)
        {
        }

    public DbSet<Location> Locations { get; set; }
    //Additional DbSets here...
}

В этом примере контекст миграции наследуется от IdentityDbContext<ApplicationUser>, так что он будет включать все ваши материалы Identity. Лучшим способом обработки инициализации может быть определение класса BaseContext, который его отключил, а затем просто наследует от этого базового контекста, как описано здесь: http://msdn.microsoft.com/en-us/magazine/jj883952.aspx. См. Эту ссылку для аналогичного вопроса с дополнительной информацией: Entity Framework: одна база данных, несколько DbContexts. Это плохая идея?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню