2017-08-16 87 views
0

我编码在Visual Studio 2017的C#和试图总结我的周围房产/模型类头关系的方式(我看过的教程/例子多小时! )。类,以及它们如何涉及到另一个在C#

我明白我可以创建一个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; } 
    } 

我不知道,如果我说,即使是有道理的,所以请让我知道如果任何其他信息将帮助。谢谢!

+0

如果客户可以有多个地址,则“客户”数据和“地址”的数据将是两个不同的数据库表。 “地址”表将有一个外键指回“客户”表,因此任何给定的“地址”记录都属于特定的“客户”记录。 – David

+0

数据库中类和表之间的关系不是一个“自然”的 - 它们完全不相关。您需要像实体框架这样的ORM来映射这两者。这是一个很大的主题 - 实体框架非常复杂。但它基本上可以完成从表中读取数据到类中的所有繁琐工作,反之亦然。 –

+0

嗨大卫,谢谢你 - 是我的数据库确实有此设置,表是有意义的,但把它变成C#是我的问题 - 我将如何使用存储类和特性的数据时,地址属于一个特定的客户? – 007bond007

回答

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(); 
} 
+0

非常感谢!这确实有很大的帮助。我唯一需要做的就是弄清楚如何将这个应用到Dapper中,但是你回答了我的问题,所以再次感谢你:) – 007bond007

0

如果我理解正确的话,你问的是,如果您检索客户的名单(可能只是一个客户)和地址列表(可能只是一个地址),您如何与每个客户的每一个地址相匹配,对?

如果是这种情况,我会做的是为这两个类定义一个公共属性,即:CustomerId,然后,一旦拥有实例,就循环遍历这两个集合以分配正确的地址由客户通过一个共同的CustomerId。

LINQ,使这种关系映射容易做到的。