首先在实体框架代码中进行多对多映射

时间:2010-12-22 18:25:30

标签: linq entity-framework-4 linq-to-entities

我正在使用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);

但每个客户都会拥有标记客户的所有用户。如何使用指定的UserId限制TaggedBy集合?

我已尝试过DbContext.Customers.Include(c => c.TaggedBy.Select(x => x.Id == userId));,但这会引发错误。

2 个答案:

答案 0 :(得分:6)

EF Feature CTP5: Fluent API Samples - ADO.NET team blog - Site Home - MSDN Blogs

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");
        }); 

Code First Mapping Changes in CTP5 - ADO.NET team blog - Site Home - MSDN Blogs

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");
    });

答案 1 :(得分:0)

将您的馆藏标记为虚拟,然后您可以轻松完成:

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;
}

在我看来,结果更清晰。