Приложение MVC 5 по умолчанию поставляется с этим фрагментом кода в IdentityModels.cs - этот фрагмент кода предназначен для всех операций идентификации ASP.NET для шаблонов по умолчанию:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
}
Если я создаю новый контроллер, используя представления с Entity Framework, и создаю «Новый контекст данных ...» в диалоговом окне, я получаю следующее:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
namespace WebApplication1.Models
{
public class AllTheOtherStuffDbContext : DbContext
{
// You can add custom code to this file. Changes will not be overwritten.
//
// If you want Entity Framework to drop and regenerate your database
// automatically whenever you change your model schema, please use data migrations.
// For more information refer to the documentation:
// http://msdn.microsoft.com/en-us/data/jj591621.aspx
public AllTheOtherStuffDbContext() : base("name=AllTheOtherStuffDbContext")
{
}
public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
}
}
Если я создам другой контроллер + представление с использованием EF, например, для модели Animal, эта новая строка будет автоматически сгенерирована public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
- как здесь:
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
namespace WebApplication1.Models
{
public class AllTheOtherStuffDbContext : DbContext
{
// You can add custom code to this file. Changes will not be overwritten.
//
// If you want Entity Framework to drop and regenerate your database
// automatically whenever you change your model schema, please use data migrations.
// For more information refer to the documentation:
// http://msdn.microsoft.com/en-us/data/jj591621.aspx
public AllTheOtherStuffDbContext() : base("name=AllTheOtherStuffDbContext")
{
}
public System.Data.Entity.DbSet<WebApplication1.Models.Movie> Movies { get; set; }
public System.Data.Entity.DbSet<WebApplication1.Models.Animal> Animals { get; set; }
}
}
ApplicationDbContext
(для всех вещей ASP.NET Identity) наследуется от IdentityDbContext
которого в свою очередь наследуется от DbContext
.
AllOtherStuffDbContext
(для моих собственных вещей) наследует от DbContext
.
Итак, мой вопрос:
Какой из этих двух ( ApplicationDbContext
и AllOtherStuffDbContext
) я должен использовать для всех моих других собственных моделей? Или я должен просто использовать автоматически сгенерированный по умолчанию, ApplicationDbContext
так как это не должно быть проблемой с его использованием, так как это происходит из базового класса DbContext
, или будут некоторые издержки? Вы должны использовать только один DbContext
объект в своем приложении для всех ваших моделей (я где-то читал это), поэтому я не должен даже рассматривать возможность использования обоих ApplicationDbContext
и AllOtherStuffDbContext
в одном приложении? Или что является лучшей практикой в MVC 5 с ASP.NET Identity?
источник
Ответы:
Я бы использовал один класс Context, унаследованный от IdentityDbContext. Таким образом, вы можете иметь контекст, чтобы быть в курсе любых отношений между вашими классами и IdentityUser и ролями IdentityDbContext. В IdentityDbContext очень мало служебных данных, это обычный DbContext с двумя наборами DbSet. Один для пользователей и один для ролей.
источник
IdentityDbContext , быстрый поиск в Stackoverflow, вызывает много недоразумений , и вы найдете следующие вопросы:
« Почему Asp.Net Identity IdentityDbContext является черным ящиком?
Как изменить имена таблиц при использовании AspNet Identity в Visual Studio 2013?
Объединить MyDbContext с IdentityDbContext "
Чтобы ответить на все эти вопросы, нам нужно понять, что IdentityDbContext - это просто класс, унаследованный от DbContext.
Давайте посмотрим на источник IdentityDbContext :
Основываясь на исходном коде, если мы хотим объединить IdentityDbContext с нашим DbContext, у нас есть два варианта:
Первый вариант:
Создать DbContext, который наследуется от IdentityDbContext и имеет доступ к классам.
Дополнительные заметки:
1) Мы также можем изменить имена таблиц по умолчанию asp.net Identity следующим решением:
2) Кроме того, мы можем расширить каждый класс и добавить любое свойство к таким классам, как «IdentityUser», «IdentityRole», ...
Чтобы сэкономить время, мы можем использовать расширяемый шаблон проекта AspNet Identity 2.0 для расширения всех классов.
Второй вариант:(Не рекомендуется) На
самом деле нам не нужно наследовать от IdentityDbContext, если мы сами пишем весь код.
Таким образом, в основном мы можем просто наследовать от DbContext и реализовать нашу настроенную версию «OnModelCreating (ModelBuilder builder)» из исходного кода IdentityDbContext
источник
Это поздняя запись для людей, но ниже моя реализация. Вы также заметите, что я не смог изменить тип KEYs по умолчанию: подробности о нем можно найти в следующих статьях:
ПРИМЕЧАНИЯ.
Следует отметить, что вы не можете использовать
Guid's
свои ключи. Это потому, что под капотом они естьStruct
, и, как таковые, не имеют распаковки, которая позволила бы их преобразование из общего<TKey>
параметра.Классы выглядят так:
источник
Если вы детализируете абстракции IdentityDbContext, вы обнаружите, что он выглядит точно так же, как ваш производный DbContext. Самый простой путь - это ответ Олава, но если вам нужен больший контроль над тем, что создается, и чуть меньше зависимости от пакетов Identity , посмотрите мой вопрос и ответ здесь . Есть пример кода, если вы переходите по ссылке, но в итоге вы просто добавляете необходимые DbSets в свой собственный подкласс DbContext.
источник