gpt4 book ai didi

c# - 处理一对多与不同相关实体的正确模式

转载 作者:太空宇宙 更新时间:2023-11-03 15:09:46 25 4
gpt4 key购买 nike

我有一个 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; }
}

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

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

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


编辑

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

最佳答案

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

你需要三个表:

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

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

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

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

用户

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

关于c# - 处理一对多与不同相关实体的正确模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41759863/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com