外键的类属性
Posted
技术标签:
【中文标题】外键的类属性【英文标题】:Class property for a Foreign key 【发布时间】:2021-01-17 07:33:50 【问题描述】:我的问题是两方面的,并且彼此相关
如何在表示外键的类中定义或编写属性以及如何使用 dapper 填充它
我正在使用的技术:
使用 dapper 作为 ORM
mysql 中的数据库
使用 WPF/C# .netframework 4.7
例如:假设有两个实体客户和一个产品, 一个客户有一个客户表,一个产品有一个产品表
一个客户可以有零个或多个产品,单个产品应该只与一个人相关,因此这是客户与产品之间的一对多关系
注意:我知道单个产品可以有更多客户,并且客户可以购买多个产品,这只是一个简单的示例,问题不在于数据库设计,而在于如何定义这些字段外键,作为一个类中的属性,其中使用的 ORM 是 dapper,数据库是 MySQL
在客户表中有 2 个字段客户 ID 和客户名称
Product表中有3个字段,Product ID和Product Name以及C_CustomerID,这里C_CustomerID是引用Customer表Primary KEY的外键
因此,您通常将两个类别分别设置为客户和产品类别及其属性 对于实例客户表有
public int CustomerID get; set;
public string CustomerName get; set;
产品表有
public int ProductID get; set;
public string ProductName get; set;
问题是如何定义外键
是这样的吗
选项 1。
public int C_CustomerID get; set;
选项 2。
public List<CustomerID> C_CustomerID get; set;
选项 3。
public List<Customer> C_CustomerID get; set;
选项 4。
public List<Customer> Customer get; set;
你如何填充这些,你是使用存储过程还是使用来自 dapper 或手动 C# 代码的函数
【问题讨论】:
@svoychik 如果你编辑了这个,你知道答案吗? “一个客户可以拥有零个或多个产品”说明了一切。以上都不是。而且还不清楚您想在哪里添加您提到的属性。 属性将被添加到一个类中,该类是产品的模型和客户的另一个模型,然后将用于 CRUD,如果不是上述情况,请提供答案@GertArnold “一个客户可以有零个或多个产品”相当于说:Customer
有一个产品集合,即List<Product>
。
【参考方案1】:
您应该按照“现实生活”而不是数据库为您的数据建模。我将跳过您的要求,即产品应该知道谁购买了它,这不是简化,只会让它变得更难。客户可以购买多种产品,并且应该拥有所购买产品的列表。通常它会这样做:
public class Customer
public int CustomerID get; set;
public string CustomerName
public List<Product> Products get; set;
public class Product
public int ProductID get; set;
public string ProductName get; set;
外键关系是你的数据库的一个实现细节,它不属于你的数据模型。因此,您应该创建一个包含 CustomerId 和 ProductId 的链接表CustomerProductLink
,在这里您将为任何Customer
购买的每个Product
添加一行。链接表也只是一个实现细节,您不应该对其进行建模。
当您加载 Customer
时,您会定制您的 SQL 以仅加载该客户购买的产品,例如:
SELECT * FROM Customers AS C
INNER JOIN CustomerProductLink AS L ON C.CustomerID = L.CustomerID
INNER JOIN Products AS P ON P.ProductId = L.ProductID
WHERE C.CustomerID = @CustomerID;
您使用 Dapper 多重映射加载客户。 这样,您的模型就可以按原样描述数据域,而关系的建模方式将隐藏在您的数据层中。
写完这篇文章后,我发现tutorial 描述的内容几乎相同。
【讨论】:
谢谢!!!! @PalleDue,真的!我很困惑,我已经阅读了这篇文章,它非常详细,给了我更多的洞察力,但最后一件事你使用了一个列表,他们使用了一个 iCollection,我应该担心还是我可以使用任何东西 你可以使用任何东西。我没有特别的理由选择 List,他们可能有一个选择 ICollection,所以你可以效仿他们。【参考方案2】:在产品模型中添加
public int CustomerID get; set;
public List<Customer> Customers get; set;
【讨论】:
非常感谢!!!花了很多时间才得到它,但是如果你不介意的话,我可以问你两件事吗 1. 你为什么要在客户模型中添加产品 ID,客户 ID 的外键在产品表中,为什么相反2. 为什么List以上是关于外键的类属性的主要内容,如果未能解决你的问题,请参考以下文章
作为 Entity Framework 6 中的外键的数据库计算属性