使用不同相关实体处理一对多的正确模式

时间:2017-01-20 09:13:14

标签: c# sql entity-framework ef-code-first

我有一个C#项目,我使用Entity Framework作为ORM。我有一个User,可以支付给很多银行。每个银行都是一个独立的实体,每个银行都由不同的领域描述。

问题是 - 一个User可能没有或多个不同的Bank。我不确定如何对此进行建模 - 临时解决方案是添加一个额外的UserBank实体,该实体与User具有1:1的实际关系。这些类看起来(或多或少)是这样的:

public class User
{
  public virtual UserBank Banks { get; set; }
  // (...)
}

public class UserBank
{
  public virtual User { get; set; }
  public virtual Bank1 { get; set; }
  public virtual Bank2 { get; set; }
  public virtual Bank3 { get; set; }
}

在这种情况下,User可能会或可能不会在任何Bank中拥有帐户。如果他没有,则值为NULL

它并不完美 - 但至少User并不需要了解Bank类型的任何信息。问题是,如果我想添加新的Bank,我需要修改UserBank实体,这违反了O中的SOLID,我会一直关注

此外,如果UserBank没有任何银行帐户,我也不喜欢User必须为N个银行存储N个空(NULL)列的想法。是否有适当的模式来处理这种情况?

修改

我知道它在原始SQL中是一个相对容易的问题。这里的问题是如何使用代码优先实现Entity Framework。

1 个答案:

答案 0 :(得分:0)

这看起来像是一种经典的m:n关系。每个用户可以拥有不同的银行,每个银行都有很多用户。

您需要三张桌子:

  • 用户(UserID,Name,...)
  • 银行(BankID,名称,......)
  • UserBank(UserBankID,UserID FK-to-User,BankID FK-to-Bank,FurtherDetails ...)

如果您想确保用户不能与同一个银行建立多个连接,您可以在UserID / BankID的组合上放置一个唯一的密钥,或者将其作为映射表的PK。但我认为这实际上并不正确......

实体表(用户/银行)包含对象的描述,但仅此而已。映射表获取描述这两者之间连接的所有必需数据(创建日期,活动日期,帐户(应该是FK到另一个实体表)等等...)

更新示例以说明m:n - 关系

用户

  1 John
  2 Jane
  3 Tim

银行

 1 Bank of England
 2 Deutsche Bank
 3 Crash & Desaster

UserBank

 1 1 1 --> User 1 is connected with Bank 1 --> John uses BoE  
 2 1 2 --> John uses Deutsche Bank too  
 3 2 1 --> And Jane is at Deutsche Bank  
 4 3 3 --> while Tim is at C&D  

更新2

首先没有EF代码的经验,但这将是C#中的一行:

public class User
{
  public int UserID{get;set}
  public string Name...
  public List<UserBank> MyBanks{ ... fetch by this.UserID ... }
}
public class Bank
{
  public int BankID{get;set}
  public string Name{get;set;}
  public List<UserBank> MyUsers{... fetch by this.BankID ... }
}

public class UserBank
{
  public int UserBankID{get;set}
  public User{get;set;}
  public Bank{get;set;} 
}