Отображение многих на многие отношения - PullRequest
2 голосов
/ 27 февраля 2012

У меня возникли проблемы с получением Entity Framework для обработки отношений «многие ко многим» в моей схеме данных.Вот моя модель:

public class User
{
    public int UserId { get; set; }
    public int Username { get; set; }
    public IEnumerable<Customer> Customers { get; set; }
    ...
}

public class Customer
{
    public int CustomerId { get; set; }
    ...
}

public class CustomerUser
{
    public int CustomerUserId { get; set; }
    public int CustomerId { get; set; }
    public int UserId { get; set; }
    public DateTime CreatedTimestamp { get; set; }
    ...
}

Вот отображение:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<User>().HasKey(u => u.UserId).ToTable("Users");
        modelBuilder.Entity<Customer>().HasKey(c => c.CustomerId).ToTable("Customer");
        modelBuilder.Entity<CustomerUsers>().HasKey(cu => cu.CustomerUserId).ToTable("CustomerUsers");

        modelBuilder.Entity<CustomerUsers>()
            .HasRequired(cu => cu.User)
            .WithRequiredDependent()
            .Map(m =>
                {
                    m.ToTable("Users");
                    m.MapKey("CustomerUsers.UserId");
                });
}

В моей базе данных есть таблица Users, Customers и CustomerUsers со столбцами, которые соответствуют модели.

Я пытаюсь выполнить следующий запрос:

result = (from u in context.Users
                      join customerUsers in context.CustomerUsers on u.UserId equals customerUsers.User.UserId
                      join customers in context.Customers on customerUsers.CustomerId equals customers.CustomerId into ps
                      select new
                      {
                          User = u,
                          Customers = ps
                      }).ToList().Select(r => { r.User.Customers = r.Customers.ToList(); return r.User; });

Когда я запускаю код, я получаю следующую ошибку:

The Column 'CustomerUserId' specified as part of this MSL does not exist in MetadataWorkspace

Может кто-нибудь увидеть, что не так с моим подходом?

Спасибо!

Следует отметить, что я намеренно пытаюсь не включать ссылку на таблицу CustomerUsers из класса Customer или User.В большинстве случаев полезная нагрузка таблицы CustomerUsers не важна, только то, какие клиенты связаны с какими пользователями.В некоторых сценариях отчетности требуется дополнительная информация в таблице соединений, но, поскольку это не типичная ситуация, я хотел бы избежать загромождения моделей, имея эту дополнительную косвенность.

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

Вместо того чтобы пытаться отобразить это как много ко многим, сопоставьте это как два один ко многим отношениям.См. Обсуждение множества таблиц соединения с полезной нагрузкой в ​​ Отношения многие ко многим в этом руководстве:

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model-for-an-asp-net-mvc-application

2 голосов
/ 27 февраля 2012

Для вашей модели вам, вероятно, понадобятся два отношения «один ко многим» и следующие свойства навигации:

public class User
{
    public int UserId { get; set; }
    public int Username { get; set; }
    // ...
    public ICollection<CustomerUser> CustomerUsers { get; set; }
}

public class Customer
{
    public int CustomerId { get; set; }
    //...
    public ICollection<CustomerUser> CustomerUsers { get; set; }
}

public class CustomerUser
{
    public int CustomerUserId { get; set; }
    public int CustomerId { get; set; }
    public int UserId { get; set; }
    public DateTime CreatedTimestamp { get; set; }
    //...
    public User User { get; set; }
    public Customer Customer { get; set; }
}

И следующее отображение:

modelBuilder.Entity<CustomerUser>()
    .HasRequired(cu => cu.User)
    .WithMany(u => u.CustomerUsers)
    .HasForeignKey(cu => cu.UserId);

modelBuilder.Entity<CustomerUser>()
    .HasRequired(cu => cu.Customer)
    .WithMany(c => c.CustomerUsers)
    .HasForeignKey(cu => cu.CustomerId);
...