2010-08-01 124 views
0

我正在使用的網站具有用戶和網站的概念。用戶可以加入全球網站並在(www.globalsite.com/minisite)內創建小型網站。用戶也可以關注由其他用戶創建的其他迷你網站。想想看,如果Twitter允許你加入一組憑證並創建不同的帳戶,一個用於@personal use,@business use等。域模型問題

我使用EF CTP4並先使用代碼。我只是不確定是否正確設計我的模型。

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; } 
    .... 
} 

這裏是我的映射:

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"); 
     } 
    } 

這是正確的,還是應該以不同的建模?我曾經有手動映射的關係:

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

語法,但現在我已經升級到CPT4,不再工作。我期望EF在DB中使用SiteId和UserId在名爲SiteFolling_UserFollowing的數據庫中創建一個關係表,但它使用SiteId(PK)和UserId(FK),帶有Following_Id(PK)和Site_Id(FK)的Following_Site和Following_User創建了Site_User表表與Following_Id(PK)和User_Id(FK)。

任何指導將是偉大的,謝謝!

+0

你可以發佈你當前的映射嗎? – TheCloudlessSky 2010-08-02 00:06:17

+0

@TheCloudlessSky - 我添加了映射代碼,有什麼想法? – Paul 2010-08-02 14:53:14

回答

0

如果你想映射many-to-many關係(用戶有很多網站),你可以做以下的CTP4在側UserMap

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

您也可以說明表,其中的許多一對多關係生活:

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

如果這不是你要找的,請讓我知道。乾杯!