C# 处理具有不同相关实体的一对多的适当模式

C# 处理具有不同相关实体的一对多的适当模式,c#,sql,entity-framework,ef-code-first,C#,Sql,Entity Framework,Ef Code First,我有一个C#项目,我使用实体框架作为ORM。我有一个用户,可以向许多银行付款。每家银行都是一个独立的实体,每个银行都由不同的字段描述 问题是-一个用户可以没有或有许多不同的银行。我真的不知道如何对此建模-临时解决方案是添加一个额外的UserBank实体,它与User成1:1的关系。这些类看起来(或多或少)是这样的: public class User { public virtual UserBank Banks { get; set; } // (...) } 及 在这种情况下,用户

我有一个C#项目,我使用实体框架作为ORM。我有一个
用户
,可以向许多银行付款。每家银行都是一个独立的实体,每个银行都由不同的字段描述

问题是-一个
用户可以没有或有许多不同的
银行。我真的不知道如何对此建模-临时解决方案是添加一个额外的
UserBank
实体,它与
User
成1:1的关系。这些类看起来(或多或少)是这样的:

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

在这种情况下,
用户
可能在任何
银行
中都有账户,也可能没有账户。如果他没有,则该值将为
NULL

它并不完美-但至少
用户
不需要了解任何有关
银行
类型的信息。问题是,如果我想添加一个新的
银行
,我需要修改
UserBank
实体,它违反了
SOLID
中的
O
,我一直试图遵循该实体

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


编辑


我知道在原始SQL中这是一个相对容易的问题。这里的问题是如何首先使用带有代码的实体框架实现这一点

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

您需要三张桌子:

  • 用户(用户ID、名称等)
  • 银行(银行ID、名称等)
  • UserBank(UserBankID,UserID FK to User,BankID FK to Bank,其他详细信息…)
如果要确保一个用户不能与同一银行有多个连接,可以在UserID/BankID的组合上放置一个唯一键,或者将其作为映射表的主键。但我不认为这是正确的事实

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

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

银行

用户银行

 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 int UserID{get;set}
公共字符串名称。。。
公共列表MyBanks{…通过this.UserID获取…}
}
公营银行
{
public int BankID{get;set}
公共字符串名称{get;set;}
公共列表MyUsers{…通过this.BankID获取…}
}
公共类用户库
{
public int UserBankID{get;set}
公共用户{get;set;}
公共银行{get;set;}
}

不幸的是,这忽略了主要问题——有许多不同的银行,每个银行都是一个完全不同的实体。单个用户银行必须与多家银行合作,主要问题是如何处理。@KamilT不,我想你弄错了。请看我的更新,现在我明白你的意思了。但仍然存在一个问题:)我首先使用实体框架和代码,这就是强制约束。换句话说-用户银行需要知道需要什么具体的
银行
实体-我不能像你建议的那样,让银行id FK到银行
,我需要一个具体的idBank@KamilT,首先我不熟悉EF代码。请避免变色龙问题。。。StackOverflow不仅是一个获取帮助的网站,而且是一个巨大的已回答问题的存档。因此,原则是:一个问题一个问题。最初的问题是关于正确的模式。我想这已经解决了。。。如果是这样,请接受我的回答,将其标记为已解决。然后针对新问题开始一个新问题(我如何首先设置与EF和code的关系?)。好的,我理解你,但是“我有一个C#项目,我使用实体框架作为ORM。”这是我问题的第一句话。无论何时你有这种感觉,你都应该有索引列(Bank1、Bank2、Bank3…)这是一个灯光明亮的指示,需要一个相关的边桌…@Shnugo你能详细说明一下吗?主要问题是如何在代码优先实体框架中处理它——我知道在原始SQL中它看起来很简单,但我不知道如何使用EF编写它
  1 John
  2 Jane
  3 Tim
 1 Bank of England
 2 Deutsche Bank
 3 Crash & Desaster
 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  
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;} 
}