Intereting Posts
Может ли что-то в C # изменить поведение сравнения float во время выполнения? Поиск образцов использования DotNetOpenAuth с WebAPI Почему нельзя клонировать IEnumerator? Как разрешить экземпляр внутри ConfigureServices в ядре ASP.NET RichTextBox не может отображать Unicode Математические буквенно-цифровые символы Установка родителя пользовательского контроля предотвращает его прозрачность Как CLR знает тип объекта в штучной упаковке? Самый оптимальный способ parsingа строки запроса в строке в C # Как обновить / перезагрузить рабочий стол Почему я получаю ошибку «Небезопасный код может появляться только при компиляции с / unsafe»? Словарь общих списков или разных типов Как подключить другой поддерживающий файл установки в мое приложение во время создания файла установки? Включить сеанс в Web Api 2 Как создать таблицы совместимых с Excel таблиц на стороне сервера в C #? Эквивалент C # / .NET для коллекций Java. emptyList ()?

в чем разница между использованием dbset и mappers в EF7

Я начал работать с .net core и Entityframework 7 в Onion Architecture ! Я прочитал этот учебник, и я думаю, что это лучший пример для изучения следующей темы. но одна часть этого урока сделала большой вопрос в моем мозгу. как то, что вы видите на этой связанной странице; на слое данных у нас есть несколько classов, которые являются нашей моделью !!

 public class User : BaseEntity { public string UserName { get; set; } public string Email { get; set; } public string Password { get; set; } public virtual UserProfile UserProfile { get; set; } } public class UserProfile : BaseEntity { public string FirstName { get; set; } public string LastName { get; set; } public string Address { get; set; } public virtual User User { get; set; } } 

и некоторый class, который отображает выше моделей, подобных этому !!

 public class UserProfileMap { public UserProfileMap(EntityTypeBuilder entityBuilder) { entityBuilder.HasKey(t => t.Id); entityBuilder.Property(t => t.FirstName).IsRequired(); entityBuilder.Property(t => t.LastName).IsRequired(); entityBuilder.Property(t => t.Address); } } public class UserMap { public UserMap(EntityTypeBuilder entityBuilder) { entityBuilder.HasKey(t => t.Id); entityBuilder.Property(t => t.Email).IsRequired(); entityBuilder.Property(t => t.Password).IsRequired(); entityBuilder.Property(t => t.Email).IsRequired(); entityBuilder.HasOne(t => t.UserProfile).WithOne(u => u.User).HasForeignKey(x => x.Id); } } 

и он использует эти classы сопоставления в методе DbContext для DbContext для создания следующих моделей в виде таблицы в базе данных:

 public class ApplicationContext : DbContext { public ApplicationContext(DbContextOptions options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); new UserMap(modelBuilder.Entity()); new UserProfileMap(modelBuilder.Entity()); } } 

Мой большой вопрос заключается в следующем: мы можем использовать DbSet для каждого объекта внутри контекста db и избегать написания mapper и создания экземпляров в методе dbcontext для dbcontext . почему этот учебник не использовал dbset ?. почему мы должны создавать картографов!

    Мой большой вопрос заключается в следующем: мы можем использовать DbSet <> для каждого объекта внутри контекста db и избегать написания mapper и создания экземпляров в методе OnModelCreating для dbcontext. почему этот учебник не использовал dbset ?. почему мы должны создавать картографов!

    new UserMap(modelBuilder.Entity()); в основном это EF Core способ настройки и сопоставления Entity в DbSet с использованием Fluent API.

    DbSet <> для каждого объекта внутри контекста db и использование Mapper для настройки DbSet одинаковы.

    В Entity Framework 6 мы используем EntityTypeConfiguration и создаем classы сопоставления, подобные этому . Это очень чистое сравнение с Data Annotation и следует принципу единой ответственности .

    Красота – нам просто нужен следующий код для автоматической настройки сотен Entities с использованием отражения.

     protected override void OnModelCreating(DbModelBuilder modelBuilder) { ... var typesToRegister = Assembly.GetExecutingAssembly().GetTypes() .Where(type => !string.IsNullOrEmpty(type.Namespace) && type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof (EntityTypeConfiguration<>)); foreach (var type in typesToRegister) { dynamic configurationInstance = Activator.CreateInstance(type); modelBuilder.Configurations.Add(configurationInstance); } base.OnModelCreating(modelBuilder); } 

    Кроме того, мы можем использовать инструменты Entity Framework Power Tools и создать конфигурацию Entities and Mapping из существующей базы данных. Для генерации сотен таблиц в classы требуется всего несколько минут. Для нас это была большая экономия времени.

    К сожалению, EntityTypeConfiguration пока недоступен в EF Core . Я думаю, что многие из нас по-прежнему любят использовать старый подход с новым EntityTypeBuilder чтобы сохранить конфигурацию Mapping вне DbContext , хотя это не так гладко, что мы сделали в EF6.

    Я рассмотрю только часть вашего «большого вопроса», вероятно, изменит ваше первоначальное предположение:

    почему этот учебник не использовал dbset? почему мы должны создавать картографы?

    Вы пропустили огромную точку. Проверьте учебник еще раз и посмотрите на этот fragment кода:

     public class Repository : IRepository where T : BaseEntity { private readonly ApplicationContext context; private DbSet entities; <---- HHHEEEERRREEEE 

    Я отметил это для вас. Да. В учебнике действительно используется DbSet <> . Тот факт, что они переносят dbsets в «repository», является просто удобством и формализмом архитектуры лука: они выставляют «IRepository» из слоя вместо непосредственного отображения DbSets - просто чтобы сохранить ссылку на EntityFramework в ожидании и не допускать никаких других слоев что EF используется внутри. Но это не означает, что они не используют DbSets. Очевидно, что в Репозитории используются DbSets.

    Это связано с тем, что DbSet и Mappings - совершенно разные вещи. Сопоставления определяют, как сопоставлять classы / свойства с таблицами / столбцами, а также добавлять некоторые метаданные, например, какой столбец должен быть не-null (= properites должен быть «обязательным»), какие / какие индексы создавать и т. Д.

    Но все эти сопоставления дают вам НЕТ способ загрузить / вставить / обновить записи. Он определяет только, как выглядит firebase database и classы.

    Для выполнения операций здесь идет DbSet. Он определяет методы, которые работают с данными, определенными картографами.