EF Core 3: настройка вспомогательного поля свойства навигации - PullRequest
1 голос
/ 10 марта 2020

Рассмотрим следующий класс. Он пытается защитить доступ к _assignedTrays .

На самом деле он работает отлично, поскольку EF автоматически связывает вспомогательное поле _assignedTrays со свойством AssignedTrays - по соглашению ( msdn )

    public class Rack
    {
        private List<Tray> _assignedTrays = new List<Tray>();

        private Rack()
        {
        }

        public Rack(string rackId)
        {
            this.Id = rackId;
        }

        public string Id { get; private set; }

        public IReadOnlyList<Tray> AssignedTrays => this._assignedTrays.AsReadOnly();

        public void Assign(params Tray[] trays)
        {
            this._assignedTrays.AddRange(trays);
        }
    }

Проблема в том, что наши стили кодирования запрещают использование подчеркивания в именах переменных; -)

Согласно другим примерам кода ( здесь ) можно просто переименовать _assignedTrays в assignedTrays и просто явно сообщить EF об этом изменении в OnModelCreating:

    modelBuilder.Entity<Rack>(e =>
    {
        e.Property(t => t.AssignedTrays).HasField("assignedTrays");
    });

Но это дает мне следующее исключение:

System.InvalidOperationException: The property 'Rack.AssignedTrays' is of type 'IReadOnlyList<Tray>' which 
is not supported by current database provider. Either change the property CLR type or ignore the property
using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.

Что мне здесь не хватает? Разве это не должно работать?

1 Ответ

2 голосов
/ 10 марта 2020

Документация не отражает действительные правила, потому что <camel-cased property name> ("стандартное" C# соглашение об именах вспомогательных полей) определенно поддерживается и, вероятно, даже с наивысшим приоритетом.

Но допустим, ваше соглашение об именах не поддерживается. Вы все еще можете отобразить поле поддержки, но вы не можете сделать это с помощью Property fluent API, потому что терминология EF Core - это не свойства, а навигация. Это относится ко всем беглым, отслеживание изменений и т. Д. c. API.

Для настройки навигации необходимо получить доступ к построителю отношений. Затем вы можете использовать свойства PrincipalToDependent и DependentToPrrncipal связанных метаданных, чтобы получить доступ / настроить два конца отношения.

Или напрямую использовать API-интерфейсы метаданных (в настоящее время для этого в любом случае не существует выделенного свободного API).

Например:

modelBuilder.Entity<Rack>()
    .FindNavigation(nameof(Rack.AssignedTrays))
    .SetField("assignedTrays");
...