Рассмотрим следующий класс. Он пытается защитить доступ к _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'.
Что мне здесь не хватает? Разве это не должно работать?
internalAssignedTrays
, и добавить комментарий о том, почему вы не можете назвать это как-то иначе, чтобы оно прошло проверку кода. - person DavidG   schedule 10.03.2020Property
не для свойств навигации), но в этом нет необходимости, поскольку соглашение EF Core поддерживает ваш стиль именования. - person Ivan Stoev   schedule 10.03.2020<camel-cased property name>
(соглашение об именах полей поддержки C # по умолчанию) также поддерживается - вероятно, с наивысшим приоритетом. - person Ivan Stoev   schedule 10.03.2020HasField
, но я возложил вину за это на «неполные тесты» ... - person thomai   schedule 10.03.2020