首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >领域建模问题

领域建模问题
EN

Stack Overflow用户
提问于 2010-08-02 06:07:54
回答 1查看 146关注 0票数 0

我工作的网站有一个用户和一个网站的概念。用户可以加入全局站点并在其中创建迷你站点(www.globalsite.com/minisite)。用户也可以关注其他用户创建的其他迷你网站。想象一下,如果Twitter允许你使用一组凭证加入,并创建不同的帐户,一个用于@个人使用,@商业使用等。

我正在使用EF CTP4,并首先使用代码。我只是不确定我的模型设计是否正确。

代码语言:javascript
运行
复制
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; }
    ....
}

下面是我的映射:

代码语言:javascript
运行
复制
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");
        }
    }

这是正确的,还是应该以不同的方式建模?我过去经常手动将关系映射为:

代码语言:javascript
运行
复制
Relationship(u => u.SitesFollowing).FromProperty(s => s.UsersFolling);

语法,但现在我已经升级到CPT4,这不再有效。我希望EF在数据库中创建一个名为SiteFolling_UserFollowing的关系表,其中包含一个SiteId和UserId,但它创建了一个包含SiteId(PK)和UserId(FK)的Site_User表,一个包含Following_Id(PK)和Site_Id(FK)的Following_Site表,以及一个包含Following_Id(PK)和User_Id(FK)的Following_User表。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-03 19:54:03

如果想要映射many-to-many关系(用户有多个站点),可以在UserMap中的CTP4中执行以下操作

代码语言:javascript
运行
复制
this.HasMany(u => u.Sites).WithMany();

您也可以描述多对多关系所在的表:

代码语言:javascript
运行
复制
this.HasMany(u => u.Sites).WithMany().Map(new StoreTableName("SiteFollowing_UserFollowing", "dbo"), (u, s) => new { UserId = u.Id, SiteId = s.Id });

如果这不是你要找的,一定要让我知道。干杯!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3383934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档