Я использую 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?
Любая помощь будет оценена по достоинству.
Решение состояло бы в том, чтобы иметь один контекст, содержащий все ваши 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. Это плохая идея?