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();