实体框架6.1:代码第一个没有在数据库中定义的相应键的导航属性

时间:2014-11-19 18:30:57

标签: c# database entity-framework

我正在尝试使用EF 6.1的Code First方法(我对它非常陌生)并且我在数据库中基于1.1或1.0关系的导航属性有一个奇怪的问题。

我有一个User类映射到User表,如下所示:

[Table("TL_MF_SEC_USER_MST")]
public class User
{
    /// <summary>
    /// Table Column : USER_ID
    /// </summary>
    [Key, Column("USER_ID")]
    public decimal ID { get; set; }
    /// <summary>
    /// Table Column : USER_CODE
    /// </summary>
    [Column("USER_CODE")]
    public string Code { get; set; }
    /// <summary>
    /// Table Column : DOMAIN_NM
    /// </summary>
    [Column("DOMAIN_NM")]
    public string Domain { get; set; }
    /// <summary>
    /// Table Column : EMPLOYEE_ID
    /// </summary>
    [Column("EMPLOYEE_ID")]
    public string EmployeeID { get; set; }

一个Employee类映射到一个看似如下的Employee表:

[Table("TL_MF_EMPLOYEE_MST")]
public class Employee
{
    /// <summary>
    /// Table Column : EMPLOYEE_CODE
    /// </summary>
    [Key, Column("EMPLOYEE_CODE")]
    public string EmployeeID { get; set; }
    /// <summary>
    /// Table Column : EMPLOYEE_NAME
    /// </summary>
    [Column("EMPLOYEE_NAME")]
    public string EMPLOYEE_NAME { get; set; }

    public string Manager { get; set; }

问题在于&#34; Keys&#34;这些表之间是User类的EmployeeID属性(不是主键),它映射到Employee类中的EmployeeID属性(也不是DB中的主键或外键)。

因此,我试图在User to Employee上创建一个导航属性,但我无法弄清楚如何告诉EF使用这两个非关键字段作为匹配用户的属性。

不幸的是,我处于一个我可能无法对实际数据库模式进行重大更改的环境中,因为此结构用于管理至少8个应用程序(其中一些有20多个实例)的权限。一些小的更改(如添加索引或约束)可能会起作用。

如果有办法通过属性或流畅的api来做到这一点,我真的很感激提醒。欢迎任何建议。

提前致谢。

1 个答案:

答案 0 :(得分:0)

EF仅接受与主键属性的关联。但它只查看模型中定义的主键。因此,由于Key上的EmployeeID属性,您可以在关联中使用它,如下所示:

public class User
{
    [Key, Column("USER_ID")]
    public decimal ID { get; set; }

    ...

    [Column("EMPLOYEE_ID")]
    public string EmployeeID { get; set; }

    public Employee Employee { get; set; } // You need this property
}

在上下文中覆盖OnModelCreating

modelBuilder.Entity<User>()
            .HasRequired(u => u.Employee) // Or HasOptional
            .WithMany()
            .HasForeignKey(u => u.EmployeeId);

显然,在Key上看到此EmployeeID属性,您确定EmployeeIDEmployee的候选键。必须绝对保证这一点才能正常工作。

很明显,您在没有迁移的情况下使用代码优先。通过迁移,此映射当然会在数据库中创建主键EmployeeId