首先使用代码的多对多关系映射视图

本文关键字:关系 映射 视图 代码 | 更新日期: 2023-09-27 18:27:12

我遇到了一个问题。这是我发现的唯一一篇描述类似问题的帖子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");
            });

在数据库中,我得到了一个映射表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和这个配置:这HasKey(e=>e.EmployeeID);这ToTable("EmployeeLocations");

它填充得很好,我可以查询它,但没有位置——它总是空的。

有人知道我该如何定义这种多对多的关系吗?

首先使用代码的多对多关系映射视图

根据您的模型,您没有加载相关实体(位置)。您需要将集合标记为虚拟集合以自动填充(延迟加载):

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

或者通过在查询中显式添加.Include(e=>e.Locations)(您需要添加命名空间System.Data.Entity才能工作):

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

希望能有所帮助!