将EntityFramework一对一映射到没有Helper属性

时间:2014-06-20 17:14:47

标签: c# sql .net entity-framework ef-code-first

上下文:

我有两个在SQL中有两个对应表的类。

  • 系统信息

    EF版:< package id =" EntityFramework"版本=" 6.1.0" targetFramework =" net45" />

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

问题

发出以下命令时:

dc.Empoyees.Add(new Employee("some employee",department));
dc.SaveChanges();

生成的插入SQL语句不包含外键,除非我在Employee下声明DepartmentId的属性以及Department属性。

问题

如何更改映射,以便EF生成并插入正确的外键&#39; DepartmentId&#39;进入员工表?

或者还有其他方法吗?

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

2 个答案:

答案 0 :(得分:3)

如果你没有在你的对象中包含它,EF将为你创建FK专栏,但它将被称为 Department_Id 而不是 DepartmentId 。您可以按如下方式覆盖此名称:

modelBuilder.Entity<Employee>()
    .HasKey(e => e.Id)
    .HasRequired(s => s.Department)
    .WithMany()
    .Map(a => a.MapKey("DepartmentId"));

当然,API绝对不是很明显。这是一个包含配置关系示例的文档 - http://msdn.microsoft.com/en-us/data/jj591620

答案 1 :(得分:0)

您不应该维护该属性,但您需要它。这就是实体框架检索然后用于获取部门的时间。

但是如果你设置了应该设置ID的部门对象。