Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将EntityFramework一对一映射到一而不使用Helper属性 背景:_C#_Sql_.net_Entity Framework_Ef Code First - Fatal编程技术网

C# 将EntityFramework一对一映射到一而不使用Helper属性 背景:

C# 将EntityFramework一对一映射到一而不使用Helper属性 背景:,c#,sql,.net,entity-framework,ef-code-first,C#,Sql,.net,Entity Framework,Ef Code First,我有两个类,它们在SQL中有两个对应的表 系统信息 EF版本: SQL版本:2012 班级 public class Employee { public Employee(string name,Department department ) { Name = name; Department = department; } public int Id {get;set;}

我有两个类,它们在SQL中有两个对应的表

  • 系统信息

    EF版本:

    SQL版本:2012

  • 班级

    public class Employee
    {
            public Employee(string name,Department department )
            {
                Name = name;
                Department = department;
            }
            public int Id {get;set;}
            public string Name {get;set;}
            public Department Department {get;set;}
    }
    
    
    
    
    public class Department
    {
        public int Id {get;set;}
        public string Name {get;set;}
    }
    
  • 桌子 这些列与属性匹配,但Employee表具有外键列DepartmentId的情况除外

  • 映射

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Employee>()
                    .HasKey(e => e.Id)
                    .HasRequired(s => s.Department);
    
        modelBuilder.Entity<Department>()
                    .HasKey(e => e.Id);
    }
    
    生成的insert SQL语句不包含外键,除非我在Employee下声明DepartmentId属性以及Department属性

    问题 如何更改映射,以便EF生成正确的外键“DepartmentId”并将其插入Employee表

    或者还有其他方法吗


    当我已经将Department作为属性时,我不想维护DepartmentId属性。

    您不必维护该属性,但您将需要它。这就是实体框架检索并随后用于获取部门的内容


    但是如果您设置了department对象,则应该设置该ID

    如果您未将FK列包含在对象中,EF将在封面下为您创建FK列,但它将被称为部门Id,而不是部门Id。您可以按如下方式覆盖此名称:

    modelBuilder.Entity<Employee>()
        .HasKey(e => e.Id)
        .HasRequired(s => s.Department)
        .WithMany()
        .Map(a => a.MapKey("DepartmentId"));
    
    modelBuilder.Entity()
    .HasKey(e=>e.Id)
    .HasRequired(s=>s.Department)
    .有很多
    .Map(a=>a.MapKey(“部门ID”);
    

    诚然,API绝对不是显而易见的。下面是一个文档,其中包含配置关系的示例-。

    感谢您的回复!我将EF视为NHibernate的替代方案。在NHibernate,我不必拥有额外的财产。因此,如果我要从NH迁移到EF,我必须将此属性添加到每个域模型(实体)?是的,这是一个很好的演示它们如何工作的过程。它可能会向实体添加额外的代码块,但这两个代码块会自动同步。我发现它在缓存系统中很有用,如果您需要在更新时运行,但不需要首先加载所有子实体。缓存的实体将拥有您需要的所有密钥。该文档用于EF 4,我使用的是EF 6。还是这样吗?除非有什么明显的变化,是的。我相信这是哲学的一部分。同样@CullenTsering,反汇编NHibernate对象并查看它是否在编译时注入这些对象或类似的东西会很有趣。
    modelBuilder.Entity<Employee>()
        .HasKey(e => e.Id)
        .HasRequired(s => s.Department)
        .WithMany()
        .Map(a => a.MapKey("DepartmentId"));