簡體   English   中英

實體使用兩個不同的鍵拆分成三個表?

[英]Entity splitting across three tables with two different keys?

我有以下無法更改的數據庫架構:

數據庫架構

TM_USERTM_USER_DETAIL表之間的關系使用USR_IDUDT_USR_ID列。 USR_ID的數據類型為int

TM_USERTM_MEMBERSHIP_USERS表之間的關系使用USR_USER_KEYUSR_ID列。 USR_USER_KEY的數據類型是用string表示的guid

我的問題是如何使用實體框架對此進行映射?

這是我的實體:

public class User
{
    // from table TM_USER
    public int Id { get; set; }
    public string Username { get; set; }
    public string Key { get; set; }

    // from table TM_USER_DETAIL
    public string Forename { get; set; }
    public string Surname { get; set; }

    // from table TM_MEMBERSHIP_USERS
    public bool IsApproved { get; set; }
}

而我的實體配置:

public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
    {
        Map(map =>
        {
            map.Properties(p => new { p.Key, p.Id, p.Username });

            map.ToTable("TM_USER");

            map.Property(p => p.Key).HasColumnName("USR_USER_KEY");
            map.Property(p => p.Id).HasColumnName("USR_ID");
            map.Property(p => p.Username).HasColumnName("USR_USER_NAME");
        });

        Map(map =>
        {
            map.Properties(p => new { p.Forename, p.Surname });

            map.ToTable("TM_USER_DETAIL");

            map.Property(p => p.Id).HasColumnName("UDT_USR_ID");
            map.Property(p => p.Forename).HasColumnName("UDT_FORENAME");
            map.Property(p => p.Surname).HasColumnName("UDT_SURNAME");
        });

        Map(map =>
        {
            map.Properties(p => new { p.IsApproved });

            map.ToTable("TM_MEMBERSHIP_USERS");

            map.Property(p => p.Key).HasColumnName("USR_ID");
            map.Property(p => p.IsApproved).HasColumnName("USR_ISAPPROVED");
        });

        HasKey(user => user.Id);
    }
}

當我嘗試查詢Users ,出現以下錯誤:

“用戶”類型的屬性只能映射一次。 非關鍵屬性“ Id”被多次映射。 確保“屬性”方法僅指定每個非關鍵屬性一次。

是否可以將EF配置為以這種方式為每個關系使用不同的鍵將單個實體映射到三個表?

我在這里發布了一個示例解決方案: https : //github.com/kevinkuszyk/entity-splitting

這是不可能的。 您應該將模型分為不同的模型。 而且,這種關系對我來說沒有意義。 在您的架構中, TM_USER具有許多TM_USER_DETAIL ,該關系允許用戶具有多個TM_USER_DETAIL和姓氏。 我認為那不是你的意圖。 在常見情況下, TM_USER只有一個TM_USER_DETAIL 因此,您的模型應該是這樣的:

TM_USER
-------------
UserId - PK
Username 
Key 
Deleted

TM_USER_DETAIL
---------------
UserId - PK - FK TM_USER
Forename 
Surname 

為了使模型更加簡單,我們可以將TM_USER_DETAILTM_USER合並。 像這樣:

TM_USER
-------------
UserId - PK
Username 
Key 
Forename 
Surname 
Deleted

相同的東西對於TM_UserTM_MEMBERSHIP_USERS之間的關系TM_User TM_MEMBERSHIP_USERS 因此,我們可以將它們合並。 像這樣:

TM_USER
-------------
UserId - PK
Username 
Key 
Forename 
Surname
IsApproved  
Deleted

現在,我們必須創建User類,以便在實體框架中使用它。

public class User
{
    // from table TM_USER 
    public int Id { get; set; }
    public string Username { get; set; }
    public string Key { get; set; }


    public string Forename { get; set; }
    public string Surname { get; set; }

    public bool IsApproved { get; set; }
}

對應:

public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
    {
        ToTable("TM_USER");

        Property(p => p.Key).HasColumnName("USR_USER_KEY");
        Property(p => p.Id).HasColumnName("USR_ID");
        Property(p => p.Username).HasColumnName("USR_USER_NAME");
        Property(p => p.Forename).HasColumnName("UDT_FORENAME");
        Property(p => p.Surname).HasColumnName("UDT_SURNAME");
        Property(p => p.IsApproved).HasColumnName("USR_ISAPPROVED");

        HasKey(user => user.Id);
    }
}

如果仍然要使用3個不同的表,則必須創建3個不同的類,並使用它們各自的屬性,將它們映射到各自的表中。

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM