0

私が取り組んでいるサイトには、ユーザーとサイトの概念があります。ユーザーはグローバル サイトに参加し、(www.globalsite.com/minisite) 内にミニ サイトを作成できます。ユーザーは、他のユーザーが作成した他のミニ サイトをフォローすることもできます。Twitter で、1 つの資格情報セットで参加して、@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 が DB に SiteFolling_UserFollowing という名前の関係テーブルを SiteId と UserId で作成することを期待していましたが、SiteId(PK) と UserId(FK) で Site_User テーブル、Following_Id(PK) と Site_Id(FK) で Follow_Site、Following_User を作成しました。次の_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 に答える