繁体   English   中英

实体框架6.1:代码优先导航属性没有在数据库中定义的对应键

[英]Entity Framework 6.1: Code First navigation properties that do not have corresponding keys defined in database

我正在尝试使用EF 6.1的“代码优先”方法(这是我的新手),但是基于数据库中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; }

问题在于这些表之间的“键”是User类中的EmployeeID属性(不是主键),它映射到Employee类中的EmployeeID属性(在数据库中也不是主键或外键)。

因此,我试图在“用户到雇员”上创建导航属性,但无法弄清楚如何告诉EF将这两个非关键字段用作与用户匹配的属性。

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

如果有一种方法可以通过属性或流利的api做到这一点,那么我将非常感谢。 欢迎任何建议。

提前致谢。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM