Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Entity Framework - One-to-One - ReferentialConstraint é mapeado para uma coluna gerada pela loja


Por convenção, EF6 representa os relacionamentos um para um usando o chamado Associação de chave primária compartilhada , onde o PK da entidade dependente também serve como FK para a entidade principal.

No seu caso, considera Account.Id para ser o FK para Customer , e como é gerado automaticamente, você obtém a exceção em questão.

O problema adicional é que o EF6 não suporta relacionamento um para um com a propriedade FK explícita (não há HasForeignKey API fluente semelhante a relacionamentos um-para-muitos).

Então você precisa remover o AccountId propriedade do modelo e deixe apenas a propriedade de navegação. Além disso, embora não seja muito necessário, seria bom seguir as convenções de nomenclatura e apenas chamá-la de Account em vez de AccountValue .

Em outras palavras, substitua
[Column("CUSTOMER_ID")]
public int? CustomerId { get; set; }

public virtual Customer CustomerValue { get; set; }

com
public virtual Customer Customer { get; set; }

O nome da coluna FK pode ser especificado usando o MapKey API fluente:
modelBuilder.Entity<Customer>()
    .HasRequired(c => c.Account)
    .WithRequiredPrincipal(a => a.Customer)
    .Map(m => m.MapKey("CUSTOMER_ID")); // <--

E você está feito.

Agora, o seguinte insere corretamente primeiro um novo Customer e, em seguida, uma nova Account referenciando-o:
var account = new Account
{
    AccountNumber = "00123456",
    Customer = new Customer { FirstName = "Joe" }
};
db.Accounts.Add(account);
db.SaveChanges();