C# 处理具有不同相关实体的一对多的适当模式
我有一个C#项目,我使用实体框架作为ORM。我有一个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; } // (...) } 及 在这种情况下,用户
用户
,可以向许多银行付款。每家银行都是一个独立的实体,每个银行都由不同的字段描述
问题是-一个用户可以没有或有许多不同的银行。我真的不知道如何对此建模-临时解决方案是添加一个额外的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;}
}