2016-01-05 29 views
0

我有以下的数据库架构,我无法改变:实体使用两个不同的键分割三个表?

database schema

TM_USERTM_USER_DETAIL表之间的关系采用USR_IDUDT_USR_ID列。数据类型USR_IDint

TM_USERTM_MEMBERSHIP_USERS表之间的关系使用USR_USER_KEYUSR_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

回答

1

这是不可能的。你应该将你的模型分成不同的模型。此外,这种关系对我来说没有意义。在你的模式中,TM_USER有很多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 
------------- 
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个不同的类别,用他们各自的属性,它们映射到它们各自的表。

希望它有帮助!

+0

感谢您的回答。很遗憾,我无法更改模式,因为它来自第三方应用程序。我也同意这种关系可以改善,但在这种情况下,我必须与之合作。 –

+0

在这种情况下,你必须为每个表格创建一个分离的模型 –

+0

是的,我不想,但是我们将不得不使EF模型反映数据库。 –

相关问题