我正在尝试使用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来做到这一点,我真的很感激提醒。欢迎任何建议。
提前致谢。
答案 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
属性,您确定EmployeeID
是Employee
的候选键。必须绝对保证这一点才能正常工作。
很明显,您在没有迁移的情况下使用代码优先。通过迁移,此映射当然会在数据库中创建主键EmployeeId
。