映射视图与代码的多对多关系优先

时间:2014-10-19 05:35:53

标签: c# ef-code-first

有一个问题我一直在努力。 这是我发现的唯一一个描述类似问题post1的帖子,但它并没有解决我的问题。

我首先在我的应用中使用EF6.1代码,需要添加视图并为其定义多对多关系。

考虑一下:

public class Employee
{
    public int EmployeeId { get; set; }

    public int EmployeeName { get; set; }

    ICollection<Location> Locations {get; set;}
}

public class Location
{
    public int LocId { get; set; }

    public int LocName { get; set; }
}

在模型构建器OnModelCreating:

            modelBuilder.Entity<Employee>().HasMany<Location>(t => t.Locations)
            .WithMany().Map(mc =>
            {
                mc.ToTable("EmployeeLocations");
                mc.MapLeftKey("EmployeeId");
                mc.MapRightKey("LocId");
            });

在db中我得到一个映射表EmployeeLocations,一切正常。

现在我想添加一个视图 - 一种员工扩展。我在DB和相关的paco类中得到了这个视图:

      public class Employee
{
    public int EmployeeId { get; set; }

    public int EmployeeName { get; set; }

     public string SomeOtherProp {get; set;}
    ICollection<Location> Locations {get; set;}
}

我为它添加了一个DbSet和这个配置:          this.HasKey(e =&gt; e.EmployeeID);          this.ToTable(“EmployeeLocations”);

它填充正常,我可以查询它,但没有位置 - 它总是空的。

是否有人知道如何定义这种多对多关系?

1 个答案:

答案 0 :(得分:0)

按照您的模型,您不会加载相关实体(位置)。您需要将集合标记为虚拟,以自动填充它(延迟加载):

public virtual ICollection<Location> Locations {get; set;}

或明确地在您的查询中添加.Include(e =&gt; e.Locations)(您需要为其工作添加名称空间System.Data.Entity):

var employeeItem = context.Employee.Include(e => e.Locations).FirstOrDefault(x => x.EmployeeName == "Bob");

希望有所帮助!