Class 属性 外键

Class property for a Foreign key

我的问题有两层并且相互关联

如何在代表外键的 class 中定义或编写 属性 以及如何使用 dapper

填充它

我正在合作的技术:

例如:假设有两个实体客户和一个产品, 一个客户有一个客户 table 一个产品有一个产品 table

一个客户可以有零个或多个产品,单个产品应该只与一个人相关,所以这是一个从客户到产品的一对多关系

注意:我知道单个产品可以有更多客户,并且客户可以购买多个产品,这只是一个简单的示例,问题不在于数据库设计,而在于如何定义这些字段是外键,作为 class 中的属性,其中使用的 ORM 是 dapper,DATABASE 是 MySQL

在 Customer table 中有 2 个字段 Customer ID 和 Customer name

Product table 有 3 个字段,Product ID 和 Product Name 和 C_CustomerID,这里 C_CustomerID 是引用客户 Table 的外键主键

所以你通常让两个 class 是一个客户和一个产品 Class 及其属性 例如客户 table 有

    public int CustomerID { get; set; }

    public string CustomerName { get; set; }

并且产品 table 有

    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# 代码中的函数

在产品型号中添加

public int CustomerID { get; set; }


public List<Customer> Customers { get; set; }

您应该根据“现实生活”而非数据库对数据建模。我将跳过你的要求,即产品应该知道谁买了它,这不是简化,但只会让它变得更难。一个客户可以购买多种产品,并且应该有一份所购买产品的清单。通常它会这样做:

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 的 link table CustomerProductLink,在这里您将为任何 Customer 购买的每个 Product 添加一行。 link table 也只是一个实现细节,您不应该对其建模。 当您加载 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描述的内容几乎相同。