3

J'ai besoin de créer une relation où j'ai une table utilisateur qui lie à une table d'adresses. Le problème est que j'ai besoin de la table d'adresses pour stocker aussi les adresses historiques. Il est également possible qu'un utilisateur n'ait pas d'adresse du tout.Entity Framework 4.1 Code First - Comment créer deux relations différentes entre deux tables

public class user 
{ 
    public virtual int ID { get; set; } 
    ... 
    public virtual int? AddressId { get; set; } 

    [ForeignKey("AddressId")] 
    public virtual Address CurrentAddress { get; set; } 

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

public class Address 
{ 
    public virtual int ID { get; set; } 
    ... 
} 

J'ai essayé différentes façons d'obtenir ce travail et a obtenu diverses erreurs comme mettre une autre table entre l'utilisateur et adresse:

public class HistoricAddress 
{ 
    public virtual int ID { get; set; } 
    public Address HistoricAddress { get; set; } 
} 

public class user 
{ 
    public virtual int ID { get; set; } 
    public virtual Address CurrentAddress { get; set; } 
    public virtual ICollection<HistricAddress> HistoricAddresses { get; set; } 
    ... 
} 

et de diverses autres façons, mais cela soulève également des erreurs. Il doit y avoir une bonne façon de faire cela. La dernière erreur que j'ai eu était:

"System.Data.Entity.Infrastructure.DbUpdateException: Une erreur s'est produite lors de la mise à jour des entrées.Voir l'exception interne pour plus de détails ---> System.Data.UpdateException: Une erreur s'est produite Lors de la mise à jour des entrées, voir l'exception interne pour plus de détails ---> System.InvalidOperationException: Une propriété dépendante d'un ReferentialConstraint est mappée à une colonne générée par le stockage Colonne: 'ID'. "

+0

Quel est le problème avec votre premier extrait de code? Les conventions Code-First doivent être correctement mappées sans autre configuration avec deux relations entre 'User' et' Address', n'est-ce pas? – Slauma

Répondre

4

Vous pouvez mapper le modèle suivant avec 3 tables.

public class user 
{ 
    public virtual int ID { get; set; } 
    ... 
    public virtual int? AddressId { get; set; } 

    public virtual Address CurrentAddress { get; set; } 

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

public class Address 
{ 
    public virtual int ID { get; set; } 

    public virtual ICollection<User> Users { get; set; } 
    ... 
} 

substituez la méthode OnModelCreating de votre commande DbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>() 
     .HasOptional(user => user.CurrentAddress).WithMany() 
     .HasForeignKey(user => user.AddressId); 

    modelBuilder.Entity<User>() 
     .HasMany(user => user.HistoricAddresses) 
     .WithMany(address => address.Users) 
      .Map(m => 
      { 
       m.ToTable("UserAddresses"); 
       m.MapLeftKey("UserId"); 
       m.MapRightKey("AddressId"); 
      }); 
} 

Tables créées sont

  • utilisateurs
  • Adresses
  • UserAddresses
+0

Vouliez-vous dire deux tables parce que je ne peux pas voir où la troisième table vient ici. J'ai également eu un problème avec le deuxième mappage fluent-api (.HasForeignKey n'était pas pris en charge sur une relation plusieurs à plusieurs). Je l'ai essayé sans .HasForeignKey mais quand j'ai exécuté le code j'ai eu la même erreur que celle que j'ai mentionnée dans mon article. – JohnCambell

+0

@JohnCambell La troisième table est 'UserAddresses'. '.HasForeignKey' a été ajouté par erreur. S'il vous plaît voir ma réponse mise à jour. – Eranga

+0

obtenu le troisième bit de table maintenant, je pensais à des entités. – JohnCambell

Questions connexes