外键的类属性

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&lt;Product&gt; 【参考方案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 和Coustomer ID 同时出现在product model @Rakib 再次谢谢你

以上是关于外键的类属性的主要内容,如果未能解决你的问题,请参考以下文章

作为 Entity Framework 6 中的外键的数据库计算属性

如何在 Django 管理页面中显示外键的属性

MySQL无法创建外键查询外键的属性

SQL中主键和外键的定义是啥???

EF Code First CTP5 - 使用属性名称作为外键的列名

数据仓库如何将具有外键的事实表连接到主键包含两个属性的维度表