Dea*_*mas 11 c# sql entity-framework-4.1
奇怪的一个.(可能根本不奇怪)
我有3个对象,员工,罗塔和部门.
public class Employee
{
    public int Id { get; set; }
    public String Name { get; set; }
    public virtual Department Department { get; set; }
}
internal class EmployeeMapping : EntityTypeConfiguration<Employee>
{
    public EmployeeMapping()
    {
        HasKey(a => a.Id);
        Property(a => a.Id).HasColumnName("UserId");
        HasRequired<Department>(a => a.Department).WithOptional().Map(a => a.MapKey("DepartmentId"));
    }
}
public class Department
{
    public int Id { get; set; }
    public String Name { get; set; }
}
internal class DepartmentMapping : EntityTypeConfiguration<Department>
{
    public DepartmentMapping()
    {
        HasKey(a => a.Id);
        Property(a => a.Id).HasColumnName("DepartmentId");
    }
}
public class Rota
{
    public int Id { get; set; }
    public virtual Employee Employee { get; set; }
    public virtual Department Department { get; set; }
}
internal class RotaMapping : EntityTypeConfiguration<Rota>
{
    public RotaMapping()
    {
        HasKey(a => a.Id);
        Property(a => a.Id).HasColumnName("RotaId");
        HasOptional<Employee>(a => a.Employee).WithOptionalDependent().Map(a => a.MapKey("EmployeeId"));
        HasOptional<Department>(a => a.Department).WithOptionalDependent().Map(a => a.MapKey("DepartmentId"));
    }
}
Run Code Online (Sandbox Code Playgroud)
一点也不复杂.Rota可以为其分配一个Employee和/或Department,所有这些都是使用Fluent配置的.我的所有关联都是正确的(架构是完美的),但我有一个奇怪的怪异.
当我执行myContext.Departments.FirstOrDefault()并查看SQL Generated时,Employee和Rota上有一个LEFT OUTER JOIN.这是为什么?
我不希望它这样做.也许我的Fluent映射不正确?我已经尝试了各种各样的,但似乎无法弄明白.如果我想要一个可以加入部门的Rota对象,我会理解的.但不是相反!
如果我这样做myContext.Departments.AsNoTracking().FirstOrDefault(),就不会进行LEFT OUTER JOIN.
有什么想法吗?
干杯,D
原因是映射不正确.看起来不错,但事实并非如此.请改用:
internal class EmployeeMapping : EntityTypeConfiguration<Employee>
{
    public EmployeeMapping()
    {
        HasKey(a => a.Id);
        Property(a => a.Id).HasColumnName("UserId");
        HasRequired<Department>(a => a.Department).WithMany()
                                                  .Map(a => a.MapKey("DepartmentId"));
    }
}
internal class RotaMapping : EntityTypeConfiguration<Rota>
{
    public RotaMapping()
    {
        HasKey(a => a.Id);
        Property(a => a.Id).HasColumnName("RotaId");
        HasOptional<Employee>(a => a.Employee).WithMany()
                                              .Map(a => a.MapKey("EmployeeId"));
        HasOptional<Department>(a => a.Department).WithMany()
                                                  .Map(a => a.MapKey("DepartmentId"));
    }
}
Run Code Online (Sandbox Code Playgroud)
在创建数据库和数据库看起来正确时,您的映射被正确解释,但EF认为您将所有关系映射为一对一.这会混淆EF,它会生成用于一对一创建内部实体引用的查询.当您告诉EF依赖实体是可选的时,这些左连接对于一对一关系是必需的 - 除非加载其密钥,否则EF不知道它们是否存在.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           897 次  |  
        
|   最近记录:  |