Заставьте EF Core 2 работать со свойством только для геттеров без поля поддержки - PullRequest
0 голосов
/ 30 января 2019

Моя цель - заставить Entity Framework 2 хорошо играть со следующим кодом:

public class Foo
{
    public Guid Id { get; } // This should NOT change

    public string NotRequiredProperty {get; set;}

    public Foo(Guid id) => Id = id;

    private Foo() { } // Empty constructor is necessary for EF Core I believe?
}

Я прочитал это сообщение в блоге , в котором говорится, что можно сделать следующее:

// Class
private Guid _id;
public Guid Id => _id;

// Configuration
modelBuilder.Entity<Foo>()
.Property(b => b.Id)
.UsePropertyAccessMode(PropertyAccessMode.FieldDuringConstruction);

Что МОЖЕТ работать.

Единственное улучшение, которое я вижу здесь, заключается в том, что я обязан явно объявить частное вспомогательное поле, даже если { get; } означает, что оно создано неявно.

Как заставить EF Core работать с JUST a { get; } (и, конечно, с некоторыми необходимыми настройками объекта)

1 Ответ

0 голосов
/ 30 января 2019

Возможно то, что вы спрашиваете в общем с введенным EF Core 2.1 Типы сущностей с конструкторами с параметрами функция.Вам больше не нужен пустой конструктор - EF Core сможет использовать конструктор с параметром Guid id.

Однако есть два ограничения, которые применяются к вашему свойству Id.Во-первых, это свойство только для чтения (следовательно, поддерживается полем readonly, которое может быть установлено только из конструктора).Эквивалент в вашем примере явного вспомогательного поля был бы, если бы вы определили его как private readonly Guid _id;.Тогда пример конфигурации не будет работать.

В разделе документации для Свойства только для чтения говорится:

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

  • Свойства без установщиков не отображаются по соглашению.(Это имеет тенденцию отображать свойства, которые не должны отображаться, такие как вычисляемые свойства.)
  • Для использования автоматически сгенерированных значений ключей требуется свойство ключа, предназначенное для чтения и записи, поскольку значение ключа должно быть установленоГенератор ключей при вставке новых объектов.

Обратите внимание на второй пункт, потому что это вторая проблема.Свойство Id в соответствии с соглашением является PK, а Guid и PK числового типа в соответствии с соглашением автоматически генерируются .

Так что вам нужно выбрать один из двух вариантов - либо сделатьId не только для чтения , добавив private set;, как указано в ссылке, или (что является ответом на вопрос "Как заставить EF Core работать с JUST a { get; }«) сделать его не сгенерированным автоматически , используя следующую свободную конфигурацию:

modelBuilder.Entity<Foo>()
    .Property(e => e.Id)
    .ValueGeneratedNever();
...