2011-03-01 6 views
2

Voici mon modèle simplifié:Entity Framework Code First: Comment modéliser une relation client/adresse?

public class Customer 
{ 
    public int ID { get; set; } 
    public int MailingAddressID { get; set; } 
    [ForeignKey("MailingAddressID")] 
    public Address MailingAddress { get; set; } 

    public virtual ICollection<Address> Addresses { get; set; } 
} 

public class Address 
{ 
    public int ID { get; set; } 
    public int CustomerID { get; set; } 
    [ForeignKey("CustomerID")] 
    public Customer Customer { get; set; } 
} 

Lorsque je tente et de créer la base de données que je reçois l'erreur suivante:

Introducing FOREIGN KEY constraint 'Customer_MailingAddress' on table 'Customers' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

Je ne comprends pas quel est le problème. Je comprends qu'un client avec une adresse ne peut pas être supprimé et qu'une adresse qui est l'adresse postale d'un client ne peut pas non plus être supprimée.

Cela correspond à mon design parce que si un client a une ou plusieurs adresses, alors une doit être une adresse postale et cette adresse ne peut pas être supprimée.

Alors qu'est-ce qui me manque ici? Merci!

Edit:

oublié de mentionner que j'ai essayé d'ajouter la ligne suivante dans la méthode OnModelBuilding:

modelBuilder.Entity<Customer>().Property(x => x.MailingAddressID).IsOptional(); 

Cela vous permet de construire la base de données, mais l'ajout d'un client, je reçois la erreur suivante:

The INSERT statement conflicted with the FOREIGN KEY constraint "Customer_MailingAddress". The conflict occurred in database "DomainModel.SeasideHeightsEntities", table "dbo.Addresses", column 'ID'. The statement has been terminated.

Toujours à la perte quant à la façon de modéliser correctement.

Répondre

3

Le problème est ... qui est supprimé en premier, le client ou l'adresse postale? Vous ne pouvez pas les supprimer tous les deux en même temps, les suppressions se produiront dans une séquence. Lorsque le premier est supprimé, il échoue la règle b/c le second n'a pas encore été supprimé. D'après ce que je peux voir de votre modèle, je n'utiliserais pas les clés étrangères pour gérer cette logique, je la manipulerais pendant la validation d'objet en mettant un attribut [Obligatoire] sur la propriété MailingAddress au lieu de la clé étrangère.

Vous devez également prendre en compte la logique d'implémentation supplémentaire pour vous assurer que MailingAddress fait partie de la collection Addresses.

+0

Eh bien, il ne devrait pas être permis d'être supprimé tant que le client a une adresse postale! C'est en partie la raison pour laquelle je pense qu'une relation FK a du sens. Cela a bien fonctionné dans ma base de données normale-premier programme EF. Des suggestions sur la façon dont je pourrais mettre en œuvre ceci avec l'approche code-first? Merci! –

+1

Je suis en désaccord respectueusement. Quelque chose doit posséder la relation. Dans ce cas, il me semble que le client est l'agrégat de domaine, et devrait donc être en charge du contrôle de son adresse postale. – Paul

+0

Je peux voir comment cela a du sens. Dans ce cas, savez-vous s'il est possible de spécifier via l'API CTP fluent que lorsqu'un client est supprimé, il doit également supprimer l'adresse postale associée (ou les autres entités qu'il "possède")? –

Questions connexes