2010-08-01 5 views
0

Le site sur lequel je travaille a le concept d'utilisateur et de site. Un utilisateur peut rejoindre le site global et créer des mini-sites (www.globalsite.com/minisite). Les utilisateurs peuvent également suivre d'autres mini-sites créés par d'autres utilisateurs. Pensez-y comme si Twitter vous permettait de joindre un ensemble d'identifiants et de créer des comptes différents, un pour l'utilisation personnelle, l'utilisation @business etc.Modélisation de domaine Question

J'utilise EF CTP4 et j'utilise d'abord le code. Je ne suis pas sûr si je conçois mon modèle correctement.

public class User : IEntity 
{ 
    public virtual ICollection<Site> Sites{ get; set; } 
    public virtual ICollection<Site> Following{ get; set; } 
    .... 
} 

public class Site: IEntity 
{ 
    public virtual User User{ get; set; } 
    public virtual ICollection<User> Following{ get; set; } 
    .... 
} 

Et ici me sont des applications:

public class UserMap : EntityConfiguration<User> 
    { 
     public UserMap() 
     { 
      HasKey(u => u.Id); 
      Property(u => u.Id).IsIdentity(); 
      Property(u => u.Name).IsRequired().IsVariableLength().HasMaxLength(75); 
      Property(u => u.Email).IsRequired().IsVariableLength().HasMaxLength(75); 
      Property(u => u.PasswordHash).IsRequired().IsVariableLength().HasMaxLength(215); 
      Property(u => u.PasswordSalt).IsRequired().IsVariableLength().HasMaxLength(88); 
      Property(u => u.IsConfirmed); 
      Property(u => u.LastActivityAt); 
      Property(u => u.CreatedAt); 
      Property(u => u.InternalRole); 
      MapSingleType(u => new 
            { 
             u.Id, 
             u.Name, 
             u.Email, 
             u.PasswordHash, 
             u.PasswordSalt, 
             u.IsConfirmed, 
             Role = u.InternalRole, 
             u.LastActivityAt, 
             u.CreatedAt 
            }).ToTable("User"); 
     } 
    } 

public class SiteMap : EntityConfiguration<Site> 
    { 
     public SiteMap() 
     { 
      HasKey(s => s.Id); 
      Property(s => s.Id).IsIdentity(); 
      Property(s => s.HasDonationPage); 
      Property(s => s.IsActive); 
      Property(s => s.IsAdminRestricted); 
      Property(s => s.IsPrivate); 
      Property(s => s.Slug).IsRequired().IsVariableLength().HasMaxLength(125); 
      Property(s => s.CreatedAt); 
      MapSingleType(s => new 
            { 
            s.Id, 
            UserId = s.User.Id, 
            ThemeId = s.Theme.Id, 
            s.HasDonationPage, 
            s.IsActive, 
            s.IsAdminRestricted, 
            s.IsPrivate, 
            s.Slug, 
            s.CreatedAt 
            }).ToTable("Sites"); 
     } 
    } 

Est-ce exact ou devrait-il être modelés différemment? Je l'habitude d'avoir les relations mappées manuellement avec le:

Relationship(u => u.SitesFollowing).FromProperty(s => s.UsersFolling); 
syntaxe

, mais maintenant que je l'ai mis à jour à CPT4, qui ne fonctionne plus. Je m'attendais à ce que EF crée une table de relation dans la base de données appelée SiteFolling_UserFollowing avec un SiteId et UserId mais elle a créé une table Site_User avec SiteId (PK) et UserId (FK), un Follow_Site avec Follow_Id (PK) et Site_Id (FK) et un Follow_User table avec Following_Id (PK) et User_Id (FK).

Toute orientation serait grande, merci!

+0

Pouvez-vous publier vos correspondances actuelles? – TheCloudlessSky

+0

@TheCloudlessSky - J'ai ajouté le code de mappage, des idées? – Paul

Répondre

0

Si vous souhaitez mapper une many-to-many relation (l'utilisateur a de nombreux sites), vous pouvez effectuer les opérations suivantes dans CTP4 dans le côté du UserMap:

this.HasMany(u => u.Sites).WithMany(); 

Vous pouvez alternativement décrire la table où le nombre à plusieurs vit relation:

this.HasMany(u => u.Sites).WithMany().Map(new StoreTableName("SiteFollowing_UserFollowing", "dbo"), (u, s) => new { UserId = u.Id, SiteId = s.Id }); 

Si c'est pas ce que vous cherchez, ne laissez-moi savoir. À votre santé!