簡體   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