繁体   English   中英

外键的 Class 属性

[英]Class property for a Foreign key

我的问题是两方面的,并且彼此相关

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

我正在使用的技术:

  • 使用 dapper 作为 ORM

  • MySQL 中的数据库

  • 使用 WPF/C# .netframework 4.7

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

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

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

在客户表中有 2 个字段客户 ID 和客户名称

在Product表中有3个字段,Product ID和Product Name以及C_CustomerID,这里C_CustomerID是引用Customer Table的Primary KEY的外键

因此,您通常会创建两个类,一个客户和一个产品 Class 及其实例客户表的属性

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

在产品 Model 添加

public int CustomerID { get; set; }


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

您应该在“现实生活”之后 model 您的数据,而不是在数据库之后。 我会跳过你的要求,即产品应该知道谁买了它,这不是简化,只会让它变得更难。 客户可以购买多种产品,并且应该拥有所购买产品的列表。 通常它会这样做:

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

外键关系是您数据库的一个实现细节,它不属于您的数据 model。 因此,您应该创建一个包含 CustomerId 和 ProductId 的链接表CustomerProductLink ,在这里您将为任何Customer购买的每个Product添加一行。 链接表也只是一个实现细节,你不应该 model 它。 当您加载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 多重映射加载客户。 这样,您的 model 就可以按原样描述数据域,并且关系的建模方式隐藏在数据层中。

写完这篇文章后,我发现本教程描述了几乎相同的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM