2014-07-25 25 views
1

給定以下兩個表示數據庫中表的類,我想將MyClass的statustype設置爲StatusType DB中兩個預定義值之一。如何更新另一個對象內的複雜對象的值?

public class MyClass 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    [DataType(DataType.MultilineText)] 
    public string Description { get; set; } 
    public virtual StatusType StatusType { get; set; } 
    } 

public class StatusType 
{ 
    public int Id { get; set; } 
    public virtual ICollection<MyClass> MyClasses{ get; set; } 
    DataType(DataType.MultilineText)] 
    public string Description { get; set; } 
} 

還有第三個表(MyClass_StatusType),它不是由一個充當多對一中介的實體來表示的。

我的代碼:

 MyClass mc = new MyClass(); 
     mc.Description = "Description"; 
     mc.StatusType.Id = 3; 
     db.MyClasses.Add(mc); 
     var id = db.SaveChanges(); 

有一個在我的StatusType記錄與3的ID當我運行這段代碼我上StatusType一個空引用異常。

什麼是在MyClass中設置此值的正確方法?

回答

0

你得到因爲訪問StatusType在此行異常

mc.StatusType.Id = 3; 

MC是一個新的對象,也沒有確定StatusType。

1)以糾正這種情況的最好方法是使用FK場StatusTypeId

mc.StatusTypeId = 3; 

2)但是,如果你不能用這個領域的其他解決辦法如下:

您應該不要設置Id(不存在的StatusType)將其設置爲現有類型。這會使數據庫獲得StatusType對象的額外往返。

var statusType = MyMethodToGetExistingStatusType(3); 
mc.StatusType = statusType; 

我不知道你可以得到你的類型的實例,但在方法MyMethodToGetExistingStatusType()你可以處理這個問題。

我希望這對你有幫助嗎?

+0

您在這裏忽略了EF FK Convention,這會導致您有額外的SQL數據庫以及更多代碼。 'MyMethodToGetExistingStatusType(3)'完全不需要。 – James

+0

是的,這是正確的,MyMethodToGetExistingStatusType()方法根本不需要,但它只是爲了澄清,他可以到達那裏他的對象。 你是對的。如果他有FK,我也會建議使用FK,但由於某種原因,他沒有這個FK。 我會將此添加到我的答案中,以便爲其他人清楚。 – user3840692

0

您在MyClass類中錯過了您的FK。如果您添加

Public int StatusTypeId {get;set;} 

這將爲您的實體映射FK。目前您只有導航屬性。

然後,而不是做

mc.StatusType.Id = 3 

你只是做

mc.StatusTypeId = 3 

這將節省您不必從StatusType表中選擇。意味着更少的代碼和更少的旅途到您的SQL服務器。

相關問題