繁体   English   中英

类,以及它们在C#中的相互关系

[英]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.

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