Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Entity Framework - One-to-One - ReferentialConstraint est mappé à une colonne générée par le magasin

Par convention, EF6 représente les relations un à un en utilisant le soi-disant Association de clé primaire partagée , où le PK de l'entité dépendante sert également de FK à l'entité principale.

Dans votre cas, il considère Account.Id être le FK du Customer , et puisqu'il est généré automatiquement, vous obtenez l'exception en question.

Le problème supplémentaire est que EF6 ne prend pas en charge la relation un à un avec la propriété FK explicite (il n'y a pas de HasForeignKey API fluide similaire aux relations un-à-plusieurs).

Vous devez donc supprimer le AccountId propriété du modèle et ne laissez que la propriété de navigation. De plus, bien que ce ne soit pas absolument nécessaire, il serait bon de suivre les conventions de dénomination et de l'appeler simplement Account plutôt que AccountValue .

En d'autres termes, remplacez

[Column("CUSTOMER_ID")]
public int? CustomerId { get; set; }

public virtual Customer CustomerValue { get; set; }

avec

public virtual Customer Customer { get; set; }

Le nom de la colonne FK peut être spécifié à l'aide de MapKey API fluide :

modelBuilder.Entity<Customer>()
    .HasRequired(c => c.Account)
    .WithRequiredPrincipal(a => a.Customer)
    .Map(m => m.MapKey("CUSTOMER_ID")); // <--

Et vous avez terminé.

Maintenant, ce qui suit insère correctement d'abord un nouveau Customer puis un nouveau Account y faisant référence :

var account = new Account
{
    AccountNumber = "00123456",
    Customer = new Customer { FirstName = "Joe" }
};
db.Accounts.Add(account);
db.SaveChanges();