[英]Entity splitting across three tables with two different keys?
我有以下無法更改的數據庫架構:
TM_USER
和TM_USER_DETAIL
表之間的關系使用USR_ID
和UDT_USR_ID
列。 USR_ID
的數據類型為int
。
TM_USER
和TM_MEMBERSHIP_USERS
表之間的關系使用USR_USER_KEY
和USR_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_DETAIL
與TM_USER
合並。 像這樣:
TM_USER
-------------
UserId - PK
Username
Key
Forename
Surname
Deleted
相同的東西對於TM_User
和TM_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.