gpt4 book ai didi

c# - C# 中的类链接最佳实践

转载 作者:可可西里 更新时间:2023-11-01 07:46:59 25 4
gpt4 key购买 nike

首先,EF 不是我们开发环境的选项,所以请不要回答“只使用 EF”...

我认为这是一个非常标准的困境,所以我敢肯定,大多数专业人士都必须采用一种我没有偶然发现的方法……所以我在这里希望你们能告诉我什么是的。

假设您有以下数据库表:

tblCompanies 
ID
NAME

tblDepartments
ID
COMPANY_ID
NAME

tblEmployees
ID
DEPARTMENT_ID
FIRSTNAME
LASTNAME

...在您的代码中的类中表示此内容的最佳方式是什么?

我认为最好的方式是这样的:

public class Company
{
public int ID { get; set; }
public string Name { get; set; }
public List<Department> Departments { get; set; }
}

public class Department
{
public int ID { get; set; }
public string Name { get; set; }
public List<Employee> Employees { get; set; }
}

public class Employee
{
public int ID { get; set; }
public string FirstName { get; set;}
public string LastName { get; set; }
}

我相信这是对此的“OOP 正确方法”。然而,似乎总是会发生这样的事情:

public class Department
{
public int ID { get; set; }
public string Name { get; set; }
public int CompanyID { get; set; }
public List<Employee> Employees { get; set; }
}

...主要是因为当您只从数据库中提取一个部门时,您将只有公司 ID,而不是完全填充公司类实例所需的所有其他属性。

(我在这里使用了一个非常普通的例子,但我在当前项目中实际处理的例子有 3 个字段用于将数据链接在一起,所以在几个类中使用相同的 3 个字段的想法似乎是错误的对我来说)

这些场景是否有最佳实践?尽管我不喜欢出于懒惰而将相同数据存储在多个类中的想法,但我也不喜欢返回一个只填充了其中一个字段的类的实例,因为那是我当时的全部.

最佳答案

这是一个常见问题,也是 ORM 试图解决的问题。可以肯定的是,这并非易事,具体取决于您的需求 和您的约束

只有两种基本选择可以保留一份信息。根据请求延迟加载数据或加载所有数据(贪婪加载)。否则你必须复制数据。

通过延迟加载,您基本上可以进行设置,以便在导航到某个属性时调用数据库并获取加载表示您正在访问的属性的实体所需的信息。需要注意的棘手部分是 SELECT N + 1 问题。当您最终迭代一组父实体并在每个子实体上触发延迟加载时,您会遇到此问题,从而导致对数据库进行 N+1 次调用以加载一组实体 (1) 及其子实体 (N)。

贪婪加载基本上就是加载您需要开始的所有内容。 ORM(它们工作的地方)很好,因为它们通过 LINQ 处理许多细节,并创建通常具有高性能和可维护性的解决方案,以及允许您操纵贪婪和延迟加载的使用的能力。

另一个重要问题是多对多关系。您需要确保没有循环初始化,并获得循环依赖的所有包袱。肯定还有很多我错过的。

以我的愚见,我不太确定是否存在最佳实践,因为有实践,其中一些不好 - 没有什么是完美的。你可以:

  1. 开始滚动您自己的对象关系映射器让您摆脱重复的 ID

  2. 使用更轻量级的 ORM 框架来处理其中的一些让您摆脱重复的 ID

  3. 创建专门的查询来加载数据聚合让您摆脱重复的 ID(* cough * DDD)

  4. 只需像上面提到的那样保留 ID 的副本,而不用担心在您的域中创建显式关系模型。

这是根据您的限制选择最佳的。这是一个很深的话题,我的经验有限...所以请对我说的话多加怀疑

关于c# - C# 中的类链接最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9489173/

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