我有一个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。
答案 0 :(得分:0)
这看起来像是一种经典的m:n
关系。每个用户可以拥有不同的银行,每个银行都有很多用户。
您需要三张桌子:
如果您想确保用户不能与同一个银行建立多个连接,您可以在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
首先没有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;}
}