2017-08-16 90 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,使這種關係映射容易做到的。