我在Visual Studio 2017中使用C#进行编码,并尝试以关系方式包围Property / Model Classes(我已经看了很多小时的教程/示例!)。
我知道我可以创建一个Customer类,其中包含名称,货币等属性,以及另一个名为Address的类,包括电话号码,国家等。
我不知道如何使用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; }
}
我不确定我所说的内容是否有意义,所以如果有任何其他信息有帮助,请告诉我。谢谢!
答案 0 :(得分:1)
你所说的是数据库对象和类之间的映射 从数据库加载数据时,只需创建具有所有相关属性(其他相关表)的期望类型的实例。
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();
}
答案 1 :(得分:0)
如果我理解正确,你问的是,如果你检索一个客户列表(可能只是一个客户)和一个地址列表(可能只是一个地址),你如何匹配每个客户的每个地址, ?
如果是这种情况,我要做的是为这两个类定义一个公共属性,即:CustomerId,然后,一旦有了实例,只需循环遍历两个集合以分配正确的地址通过一个共同的CustomerId给客户。
有LINQ使这种关系映射更容易。