2017-05-14 6 views
0

Je n'ai pas été en mesure de trouver une réponse à ce problème spécifique, peut-être à ma nouveauté avec Entity FrameworkEF 6 API Courant avec un à plusieurs et beaucoup à multiplicités De nombreux et contradictoires

J'ai deux entités: l'utilisateur et installation.

La table Facility requiert un propriétaire (utilisateur), mais une Facility peut également avoir plusieurs «FacilityUsers» assignés à une Facility.

public class User 
{ 
    .... 
    public virtual ICollection<Facility> Facilities { get; set; } 
} 

public Facility Facility 
{ 
    public Guid OwnerId { get; set; } 
    ... 
    public virtual User Owner { get; set; } 
    public virtual ICollection<User> FacilityUsers { get; set; } 
} 

Voici mon ModelBuilder

////Many To Many: Users To Facilities 
modelBuilder.Entity<User>() 
    .HasMany(i => i.Facilities) 
    .WithMany(u => u.FacilityUsers) 
    .Map(m => 
    { 
     m.MapLeftKey("UserId"); 
     m.MapRightKey("FacilityId"); 
     m.ToTable("UserFacility"); 
    });   

//One to Many: Facility To Owner 
modelBuilder.Entity<Facility>() 
    .HasRequired<User>(s => s.Owner) 
    .WithMany(s => s.Facilities) 
    .HasForeignKey(k => k.OwnerId); 

Le problème est, quand j'ai la carte Facility au propriétaire, je reçois l'erreur suivante: La propriété de navigation 'FacilityUsers' a déclaré le type ' MEH.Web.Models.Entities.Facility 'a été configuré avec des multiplicités conflictuelles.

Cependant, lorsque j'exclus le Facility au propriétaire de mappage, cela fonctionne.

//One to Many: Facility To Owner 
//modelBuilder.Entity<Facility>() 
// .HasRequired<User>(s => s.Owner) 
// .WithMany(s => s.Facilities) 
// .HasForeignKey(k => k.OwnerId); 

Le problème est, la installations table a alors un Owner_UserId champ qui est nul, mais il est rempli correctement le OWNERID. Mon TOC ne me laisse pas passer à autre chose jusqu'à ce que j'ai résolu le problème "Owner_UserId".

Merci, D

Répondre

1

Vous ne pouvez pas mapper une propriété de navigation collection (Facilities) à deux relations.

Soit ajouter une nouvelle collection pour one-to-many relation:

public class User 
{ 
    .... 
    public virtual ICollection<Facility> Facilities { get; set; } 
    public virtual ICollection<Facility> OwnedFacilities { get; set; } 
} 

et plan:

//One to Many: Facility To Owner 
modelBuilder.Entity<Facility>() 
    .HasRequired(s => s.Owner) 
    .WithMany(s => s.OwnedFacilities) // <- another collection 
    .HasForeignKey(k => k.OwnerId); 

ou garder le modèle User comme il est maintenant, mais configurer one-to-many relation comme unidirectionnel (sans propriété de navigation de collection):

//One to Many: Facility To Owner 
modelBuilder.Entity<Facility>() 
    .HasRequired(s => s.Owner) 
    .WithMany() // <- no collection 
    .HasForeignKey(k => k.OwnerId); 
+0

Merci beaucoup !!! Je devais ajouter **. WillCascadeOnDelete (false) ** aussi. –