【问题标题】:Proper pattern to handle one-to-many with different related entities处理与不同相关实体的一对多的正确模式
【发布时间】:2017-06-05 05:15:09
【问题描述】:

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

问题是 - 一个User 可以没有或有多个不同的Banks。我不太确定如何对此建模 - 临时解决方案是添加一个额外的 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 可能有也可能没有任何Banks 中的帐户。如果他没有,则值为NULL

它并不完美——但至少User 不需要知道任何关于Bank 类型的信息。问题是,如果我想添加一个新的Bank,我需要修改UserBank 实体,这违反了SOLID 中的O,我试图始终遵循。

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


编辑

我知道在原始 SQL 中这是一个相对简单的问题。这里的问题是如何使用代码优先的实体框架来做到这一点。

【问题讨论】:

  • 当您有感觉时,您应该有索引列(Bank1、Bank2、Bank3 ...),这是需要相关边桌的明亮指示 ...
  • @Shnugo 你能详细说明一下吗?主要问题是如何在代码优先的实体框架中处理它 - 我知道它在原始 SQL 中看起来很容易,但我不知道如何用 EF 编写它

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


【解决方案1】:

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

你需要三个表:

  • 用户(用户 ID、姓名、...)
  • 银行(BankID、姓名、...)
  • UserBank(UserBankID、UserID FK-to-User、BankID FK-to-Bank、FurtherDetails ...)

如果您想确保一个用户不能与同一家银行有多个连接,您可以在 UserID/BankID 的组合上放置一个唯一键,或者让它成为您映射表的 PK。但我不认为这实际上是正确的......

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

更新示例来说明m:n-relationship

用户

  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  

更新 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;} 
}

【讨论】:

  • 不幸的是,这忽略了主要问题 - 有许多不同的银行,每一个都是完全不同的实体。单个 UserBank 必须与多家银行合作,而主要问题是如何处理。
  • @KamilT 不,我认为你搞错了。请看我的更新
  • 好的,现在我明白你的意思了。但是仍然存在一个问题:) 我使用实体框架和代码优先,这是强制约束。换句话说 - UserBank 需要知道需要什么具体的 Bank 实体 - 我不能像你建议的那样拥有 BankID FK-to-Bank,我需要一个具体银行的 id
  • @KamilT,我不熟悉 EF-code-first。请避免变色龙问题... StackOverflow 不仅是一个寻求帮助的网站,而且还是一个巨大的已回答问题档案。因此原则:一个问题 - 一个问题。最初的问题是关于正确的模式。我认为这已经解决了......如果是这样,请接受我的回答以将其标记为已解决。而不是针对新问题开始一个新问题(如何使用 EF 和代码优先设置m:n-relationship?)。
  • 好的,我理解你,但是“我有一个 C# 项目,我使用实体框架作为 ORM。”是我问题中的第一句话。
猜你喜欢
  • 2017-04-08
  • 2016-08-24
  • 1970-01-01
  • 2016-07-23
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多