0

我正在处理的站点具有用户和站点的概念。用户可以加入全球站点并在 (www.globalsite.com/minisite) 内创建迷你站点。用户还可以关注其他用户创建的其他迷你站点。想一想,如果 Twitter 允许您使用一组凭据加入并创建不同的帐户,一个用于@personal 使用,@business 使用等。

我正在使用 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 在名为 SiteFolling_UserFollowing 的数据库中创建一个具有 SiteId 和 UserId 的关系表,但它创建了一个带有 SiteId(PK) 和 UserId(FK) 的 Site_User 表,一个带有 Follow_Id(PK) 和 Site_Id(FK) 的 Follow_Site 以及一个 Follow_User具有 Follow_Id(PK) 和 User_Id(FK) 的表。

任何指导都会很棒,谢谢!

4

1 回答 1

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

如果这不是您要找的,请告诉我。干杯!

于 2010-08-03T11:54:02.660 回答