我有以下的数据库架构,我无法改变:实体使用两个不同的键分割三个表?
的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
。
我的问题是如何使用实体框架映射此?
这里是我的实体:
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
,我收到以下错误:
Properties for type 'User' can only be mapped once. The non-key property 'Id' is mapped more than once. Ensure the Properties method specifies each non-key property only once.
是有可能配置EF以这种方式使用不同的密钥将单个实体映射到三个表对于每个关系?
我已经发布的样品溶液在这里: https://github.com/kevinkuszyk/entity-splitting
感谢您的回答。很遗憾,我无法更改模式,因为它来自第三方应用程序。我也同意这种关系可以改善,但在这种情况下,我必须与之合作。 –
在这种情况下,你必须为每个表格创建一个分离的模型 –
是的,我不想,但是我们将不得不使EF模型反映数据库。 –