[英]Classes, and how they relate to one another in C#
我正在使用C#在Visual Studio 2017中进行编码,并试图以一种相关的方式将属性/模型类包起来(我已经看了很多小时的教程/示例!)
我知道我可以创建一个具有名称,货币等属性的Customer类,以及另一个具有电话号码,国家/地区等地址的类。
我不明白的是如何使用MS SQL数据库以关系方式创建它们。 例如,我创建了一个客户“ ACME Inc.” 它的属性之一是PrimaryAddress,它的类型设置为“ Address”,因此我可以直接链接到该地址的属性,但是,如果我需要根据从表中读取的数据来创建属性,我将不知道该怎么做。 当然可以执行customer1.PrimaryAddress.Country = Canada,或分别创建一个称为Address1的地址对象,但是如何使用Customer的属性引用现有的Address对象?
例:
public class Customer
{
public string Name { get; set; }
public bool Enabled { get; set; }
public CAddress PriAddress { get; set } //This points to an object created using the CAddress class below. each customer has only 1 primary address
}
public class CAddress
{
public int CustomerID { get; set; } //This specifies which Customer this address belongs to
public string Name { get; set; }
public string MainNum { get; set; }
}
我不确定我所说的话是否有意义,所以请让我知道其他信息是否有帮助。 谢谢!
您所说的是数据库对象和类之间的映射。
从数据库加载数据时,您只需创建具有所有相关属性(其他相关表)的预期类型的实例。
SELECT c.Id
, c.Name
, a.Id As AddressId
, a.Street As AddressStreet
FROM Customer c
INNER JOIN Address a ON a.CustomerId = c.Id
var query = "SELECT ...";
using (var connection = new SqlConnection())
using (var command = new SqlCommand(query, connection))
{
var customers = new List<Customer>();
connection.Open();
using (var reader = command.ExecuteReader())
{
while(reader.Read())
{
var customer = new Customer
{
Id = reader.GetInt32(0),
Name = reader.GetString(1),
PrimaryAddress = new Address
{
Id = reader.GetInt32(2),
Street = reader.GetString(3)
}
};
customers.Add(customer);
}
}
}
当然,您可以使用一些ORM框架,使您的映射代码更加优雅,并且所有映射工作都将由ORM框架完成。
实体框架示例返回包含地址的所有客户
using (var dbContext = new CustomerDbContext(connectionString))
{
return dbContext.Customers.Include(customer => customer.PrimaryAddress).ToList();
}
如果我理解正确,那么您要问的是,如果您检索一个客户列表(可能只是一个客户)和一个地址列表(可能只是一个地址),那么如何将每个地址与每个客户匹配,对吗?
如果是这种情况,我要做的是为这两个类定义一个公共属性,即:CustomerId,然后,一旦有了实例,就循环遍历两个集合以为客户分配正确的地址通过通用的CustomerId。
有LINQ使这种关系映射更容易实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.