Class 属性 外键
Class property for a Foreign key
我的问题有两层并且相互关联
如何在代表外键的 class 中定义或编写 属性 以及如何使用 dapper
填充它
我正在合作的技术:
将 dapper 用作 ORM
MySQL
中的数据库
使用 WPF/C# .netframework 4.7
例如:假设有两个实体客户和一个产品,
一个客户有一个客户 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描述的内容几乎相同。
我的问题有两层并且相互关联
如何在代表外键的 class 中定义或编写 属性 以及如何使用 dapper
填充它我正在合作的技术:
将 dapper 用作 ORM
MySQL
中的数据库使用 WPF/C# .netframework 4.7
例如:假设有两个实体客户和一个产品, 一个客户有一个客户 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描述的内容几乎相同。