[英]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.