почему ef core FisrtOrDefault () будет вызывать конструктор параметров объекта? - PullRequest
0 голосов
/ 26 мая 2020

извините, я не очень хорошо владею английским sh !!

Я использую ef core 3.1.4, я просто не понимаю

  • почему 【 Метод IQueryable.FirstOrDefault ()】 вызовет конструктор параметров объекта?
  • какое правило сопоставления?

результат и код здесь:

Результат Program.cs

enter image description here

Program.cs

using System;
using System.Linq;
using System.Text.Json;
using IdentityClient.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;

namespace IdentityClient
{
    class Program
    {
        static void Main(string[] args) {
            var services = new ServiceCollection();
            services.AddDbContext<MyDbContext>(x => x.UseInMemoryDatabase("db"));
            var provider = services.BuildServiceProvider();

            var writeContext = provider.CreateScope().ServiceProvider.GetRequiredService<MyDbContext>();
            var admin = new UserEntity("admin", "admin123");
            Console.WriteLine(JsonSerializer.Serialize(admin));
            writeContext.User.Add(admin);
            writeContext.SaveChanges();

            var readContext = provider.CreateScope().ServiceProvider.GetRequiredService<MyDbContext>();
            var user = readContext.User.FirstOrDefault();
            Console.WriteLine(user == null ? "" : JsonSerializer.Serialize(user));

            Console.ReadLine();
        }
    }
}

MyDbContext.cs

using Microsoft.EntityFrameworkCore;

namespace IdentityClient.Data
{
    public class MyDbContext:DbContext
    {
        public MyDbContext(DbContextOptions<MyDbContext> options):base(options)
        {

        }

        public DbSet<UserEntity> User { get; set; }
    }
}

UserEntity.cs

using System;

namespace IdentityClient.Data
{
    public class UserEntity
    {
        //1.why query will call the constructor?
        public UserEntity(string name, string password) {
            Id=Guid.NewGuid();
            Name = name;
            Salt = Guid.NewGuid().ToString();
            //2.why [Password] is different,what is the rule
            Password = Salt;
        }
        public Guid Id { get; set; }
        public string Name { get; set; }
        public string Password { get; set; }
        public string Salt { get; set; }
    }
}

1 Ответ

1 голос
/ 27 мая 2020

1. Почему запрос вызывает конструктор?

Начиная с EF Core 2.1, теперь можно определить конструктор с параметрами и заставить EF Core вызывать этот конструктор при создании экземпляра сущности. Параметры конструктора могут быть привязаны к сопоставленным свойствам или к различным видам служб, чтобы облегчить поведение, такое как отложенная загрузка.

Когда EF Core создает экземпляры этих типов, например, для результатов запроса, он будет сначала вызовите конструктор без параметров по умолчанию, а затем установите для каждого свойства значение из базы данных. Однако, если EF Core находит параметризованный конструктор с именами параметров и типами, соответствующими сопоставленным свойствам, он вместо этого вызовет параметризованный конструктор со значениями для этих свойств и не будет явно устанавливать каждое свойство.

https://docs.microsoft.com/en-us/ef/core/modeling/constructors

2. Почему [Пароль] отличается, каково правило?

На основе документации Microsoft вы можете сопоставить результаты запроса со свойствами сущности по следующему соглашению:

Типы параметров и имена должны соответствовать типам и именам свойств, за исключением того, что свойства могут быть Pascal в регистре, в то время как параметры - в верблюжьем.

Если вы не принимаете параметр для спецификации c свойство, которое оно будет отображать неявно. поэтому Salt заполняется из запроса, а Password заполняет конструктор.

Postscript : установка свойства другим свойством в конструкторе не является хорошей практикой. потому что порядок объявления или утверждений может повлиять на конечный результат. например В вашем случае, когда вы меняете строки 19,20 друг с другом в в этом примере вы получите ожидаемый результат, и это неприятный запах в вашем коде.

введите описание изображения здесь

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