Вопрос по моделированию домена - PullRequest
0 голосов
/ 02 августа 2010

Сайт, над которым я работаю, имеет концепцию пользователя и сайта.Пользователь может присоединиться к глобальному сайту и создать мини-сайты (www.globalsite.com/minisite).Пользователи также могут следить за другими мини-сайтами, созданными другими пользователями.Подумайте об этом, как если бы Twitter позволил вам присоединиться к одному набору учетных данных и создать разные учетные записи, одну для @ личного использования, @ делового использования и т. Д.

Я использую 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, но он создал таблицу Site_User с SiteId (PK) и UserId (FK), Follow_Site с Follow_Id (PK) и Site_Id (FK) и Follow_Userтаблица с Follow_Id (PK) и User_Id (FK).

Любое руководство было бы здорово, спасибо!

1 Ответ

0 голосов
/ 03 августа 2010

Если вы хотите отобразить отношение 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 });

Если это не то, что вы ищете, дайте мне знать. Ура!

...