сначала сопоставление многих со многими в коде структуры сущности - PullRequest
3 голосов
/ 22 декабря 2010

Я использую Entity Framework 4 CTP5 Code First, и у меня есть модель в соответствии с:

public class User {
   public int UserId { get; set; }
   public string Email { get; set; }
   public ICollection<Customer> TaggedCustomers { get; set; }
}
public class Customer {
  public int CustomerId { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public ICollection<User> TaggedBy { get; set; }
}

Существует множество отношений, при которых Пользователь может «пометить» Клиента, а Клиент может «пометить» многих пользователей. У меня есть рабочий DbContext, и я могу запрашивать клиентов, используя

 var customers = DbContext.Customers.Include(c => c.TaggedBy);

Но у каждого клиента будут все пользователи, которые пометили его. Как ограничить коллекцию TaggedBy только результатом с указанным идентификатором пользователя?

Я пробовал по линии DbContext.Customers.Include(c => c.TaggedBy.Select(x => x.Id == userId));, но это выдает ошибку.

Ответы [ 2 ]

6 голосов
/ 24 декабря 2010

EF Feature CTP5: Свободные примеры API - Блог команды ADO.NET - Домашняя страница сайта - Блоги MSDN

modelBuilder.Entity<Product>() 
    .HasMany(p => p.Tags)
    .WithMany(t => t.Products)
    .Map(m =>
        {
            m.MapLeftKey(p => p.ProductId, "CustomFkToProductId");
            m.MapRightKey(t => t.TagId, "CustomFkToTagId");
        }); 

Изменения в отображении кода в CTP5 - Блог команды ADO.NET - Домашняя страница сайта - Блоги MSDN

modelBuilder.Entity<Product>()
    .HasMany(p => p.SoldAt)
    .WithMany(s => s.Products)
    .Map(mc => {
        mc.ToTable("ProductsAtStores");
        mc.MapLeftKey(p => p.Id, "ProductId");
        mc.MapRightKey(s => s.Id, "StoreId");
    });
0 голосов
/ 22 декабря 2010

Отметьте ваши коллекции как виртуальные, и тогда вы легко сможете:

public class User
{
    public int UserId { get; set; }
    public string Email { get; set; }
    public virtual ICollection<Customer> TaggedCustomers { get; set; }
}

public class Customer
{
    public int CustomerId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual ICollection<User> TaggedBy { get; set; }
}

using(var context = new MyDbContext())
{
    var user = context.Users.Single(o => o.UserId == 0);
    var customers = user.TaggedCustomers;
}

На мой взгляд, код получается намного чище.

...