Quero usar um campo de apoio do EF Core .
A entidade possui:
public IReadOnlyCollection<Product> Products => _products;
private readonly List<Product> _products = default!;
Configuração EF:
builder
.HasMany(x => x.Products)
.WithOne()
.HasForeignKey(x => x.ManufacturerId)
.OnDelete(DeleteBehavior.Cascade);
builder // <----- problem here
.Property(x => x.Products)
.HasField("_products");
Isso produz:
Não foi possível criar um 'DbContext' do tipo ''. A exceção 'A propriedade ou navegação 'Produtos' não pode ser adicionada ao tipo 'Fabricante' porque uma propriedade ou navegação com o mesmo nome já existe no tipo 'Fabricante'.' foi gerada durante a tentativa de criar uma instância.
Suspeito que o código de configuração tenta adicionar a mesma navegação duas vezes. Qualquer uma delas pode ser usada, mas não simultaneamente. Eu poderia remover uma e confiar em convenções, mas não quero fazer isso, pois prefiro código de configuração explícito.
Como posso configurar explicitamente esse campo de apoio e evitar o erro?
Pela terminologia EFC, propriedades de tipo simples (primitivas) são propriedade , enquanto propriedades de navegação (tanto de referência quanto de coleção) são navegação . Elas têm APIs fluentes diferentes, e não usar a correta leva a erros, como no seu caso.
Simplificando,
Property
a API serve para definir e configurar propriedades eNavigation
é a API correspondente para navegações.Portanto, tudo o que você precisa é usar
no lugar de
Você quer que o EF Core crie o relacionamento com o campo de apoio em vez da propriedade. Você também precisa garantir que o EF Core não adicione a propriedade. Você pode usar Ignorar para fazer isso.