2013-01-09 22 views
0

我的實體模型中有一個主詳細信息關係(爲了讓您輕鬆思考經典的Northwind Orders- OrderDetails)最終用戶將在網格中輸入主要部分的詳細信息,然後向下移動到較低的網格以輸入「相關」細節。如何從實體框架的詳細信息部分中檢索主詳細信息關係的主部分中的字段的值

從實體模型本身中,我希望能夠從Orders表中檢索到相同的'CustomerId'值,每當我創建一個與該訂單相關的新OrderDetail記錄並使用它來檢索某個特定需要在每個詳細記錄中記錄的信息。

是否有一種簡單的方法可以在實體模型本身中執行此操作。我會在vb中這樣做,但我可以只讀一下C#。

附加信息進行澄清:

Jeric提出在他的回答中,我感謝他一個有趣的問題,這表明該表可能不是正確的正常化。在任何正常情況下,我都會同意,但在這裏,我受到了我無法控制的束縛。 Tis用於記錄商業漁民登陸魚類的應用程序。每次着陸都可能包括幾種不同的魚類,所有着陸細節都必須通過法律報告給政府機構,政府機構又將這些信息傳遞給使用該信息的科學家計算魚類存量並因此計算捕獲量的限額。

爲此目的,魚被捕獲的位置非常重要,因此每條細節線(着陸細節線)都必須記錄物品被捕獲的區域和區域。對於大多數小船來說,這些信息幾乎總是相同的(但是幾個月來大的船隻可以在幾個區域和區域捕魚(因此需求))。

爲了讓應用程序的最終用戶更容易做到這一點,我覺得在船舶記錄(相當於Northwind客戶)中記錄默認區域和區域的詳細信息是有意義的。在登陸標題表(Northwind Order)中,我有一個對vesselId的引用。因此輸入登陸詳細信息行時,我希望返回登陸標題並檢索船隻ID,然後將其用作函數中的參數以檢索與該船隻相關的默認區域和區域。

由於我使用實體框架來做到這一點,我還不知道登陸的最終ID是什麼(它還沒有被提交,實體框架的美妙之處在於它使得這種排序的數據輸入很簡單),所以我試圖從登陸標題中得到尚未爲其創建「官方」標識的船隻編號。

我希望對於在大多數情況下(包括我自己)的問題提示一個人認爲這是數據庫規範化問題更有意義。

我想要做的是在着陸細節實體的PropertyChanging事件之一中找到一種方法來檢索其關聯的着陸標頭實體的vesselId,該實體仍然要提交給數據庫。它位於clientcache中,但尚未存在於數據庫中。

非常感謝

+0

使「CustomerId」成爲「Order」類的成員。 –

回答

0

如果我收到了你的問題是正確的,你是說,有你的OrderDetail實體的一些屬性是基於您的客戶實體填充。我覺得這很奇怪,因爲您應該能夠通過遍歷從OrderDetail到Order到Customer的鏈接查詢OrderDetail實體的任何客戶詳細信息。您不需要在OrderDetail表下持續保留Customer屬性(例如Gender)。您可能想考慮嘗試更好地規範化您的模式。

在任何情況下,說你有這些實體:

public class Customer { 
    [Key] 
    public int Id {get; set;} 
    public string Name {get; set;} 
    public string Gender {get; set;} 
    public virtual ICollection<Order> Orders {get; set;} //<-- I'm also assuming you have a 1 Customer to Many Order relationship 
} 


public class Order { 
    [Key] 
    public int Id {get; set;} 
    [Required] 
    public int CustomerId {get; set;} 
    public virtual Customer Customer {get; set;} //<-- assumes a Customer Entity also exists 
    public virtual ICollection<OrderDetail> OrderDetails {get; set;} //<-- I'm also assuming you have a 1 Order to Many Order Detail relationship 
} 

public class OrderDetail { 
    [Key] 
    public int Id {get;set;} 
    [Required] 
    public int OrderId {get; set;} //<-- each Order Detail *must* be linked to an order 
    public virtual Order Order {get; set;} 
    public string CustomerGender {get; set;} //<-- property that gets populated based on the customer that is related to the parent Order of this detail 
    //other properties 
} 

當你構建你的OrderDetail例如,你應該知道爲了它與,但不一定是客戶可在該情況下,可以看出:

var orderDetail = new OrderDetail {OrderId = 1}; 

在您的插入方法,你要確保你得到了客戶的細節,並填充相關領域中的OrderDetail,插入之前。既然你知道OrderId,你可以使用LINQ來查詢相關的客戶細節。在這個例子中,我們想要獲得Customer.Gender並將它分配給OrderDetail.CustomerGender。你可以用一個語句寫出來,但爲了便於閱讀,我會分解它。

//step 1, get the Customer object based on the OrderId 
var cust = context.Set<Order>().Include(o => o.Customer) 
        .Where(o => o.Id == orderDetail.OrderId) 
        .Select(o => o.Customer).SingleOrDefault(); 

//step 2, assign the Customer object property to the OrderDetail instance 
orderDetail.CustomerGender = customer.Gender; 

//step 3, persist the orderDetail entity 
context.Set<OrderDetail>().Add(orderDetail); 
context.SaveChanges(); 
相關問題