2013-07-31 132 views
1

由於實體框架的狀態,在這裏我們去的代碼先刪除孩子的......實體框架代碼首先,通過「先典」更新父

public class BaseModel 
{ 
    [Key] 
    public Guid Id { get; set; } 
    public DateTime DateCreated { get; set; } 
    public DateTime DateChanged { get; set; } 

    public BaseModel() 
    { 
     this.Id = Guid.NewGuid(); 
     this.DateCreated = DateTime.Now; 
     this.DateChanged = DateTime.Now; 
    } 
} 

public class Association: BaseModel 
{ 
    public string Name { get; set; } 
    public string Type { get; set; } 

    public virtual List<Rule> Rules { get; set; } 

    public Association() 
     : base() 
    { 
    } 
} 

public class Rule: BaseModel 
{ 
    [ForeignKey("Association")] 
    public Guid AssociationId { get; set; } 

    //[Required] 
    public virtual Association Association { get; set; } 

    //[Required] 
    public string Name { get; set; } 

    public string Expression { get; set; } 

    public virtual List<Action> Actions { get; set; } 

    public Rule() 
     : base() 
    { 
    } 
} 

public class Action: BaseModel 
{ 
    public string Name { get; set; } 

    public string ActionType { get; set; } 

    [ForeignKey("Rule")] 
    public Guid RuleId { get; set; } 

    public virtual Rule Rule { get; set; } 

    public int Order { get; set; } 

    public Action() 
     : base() 
    { 
    } 
} 

因此,這些都是我的四個模型類,使用實體框架代碼第一。 每個都從基類繼承,所以它們都有一個Id Guid作爲主鍵。

一個關聯有一個規則列表。 (規則具有FK給協會) 規則與動作列表一樣。 (動作有FK來規則)

我想要做的只是改變並保存最向上的class = Association。 例如刪除規則時,我想這個代碼工作:

public ActionResult DeleteRule(Guid assId, Guid ruleId) 
    { 
     Association ass = this.DataContext.Associations.FirstOrDefault(a => a.Id == assId); 
     ass.Rules.RemoveAll(r => r.Id == ruleId); 

     this.DataContext.SaveChanges(); 

     return RedirectToAction("Index"); 
    } 

在這給我這個錯誤context.savechanges: 「操作失敗:關係不能被改變,因爲一個或更多的外鍵屬性是不可空的。當對關係進行更改時,相關的外鍵屬性將設置爲空值。如果外鍵不支持空值,則必須定義新的關係,必須爲外鍵屬性指定另一個非空值,或者必須刪除不相關的對象。

刪除操作時也會發生此錯誤。

有沒有辦法改變最上層(關聯)對象,只有改變這個關聯的東西。 我不想說context.Rules.remove(...)或context.actions.remove(...)

這裏的源:http://server.thomasgielissen.be/files/mvctesting.zip 你需要VS2012,所有的Nu​​Get包包含在ZIP和你應該能夠建立並運行項目。

在此先感謝您的反饋!

格爾茨, 托馬斯

+0

您需要重新格式化這個問題。簡化您的問題描述並在帖子中包含最少的相關代碼。就目前而言,你很難獲得幫助。 – Michal

+0

問題已更新!,希望我現在可以獲得幫助:) –

回答

0

我要解決這個問題,您應該存儲通過交接表的關係。我不認爲你可以用這個模型達到你所需要的。

但是,如果您在實體之間放置聯結表(或實體),則可以輕鬆地刪除子對象並更新父對象。

例如,把一個結實體AssociationRule之間:

public class AssociationRule: BaseModel 
{ 
    public Guid AssociationId { get; set; } 
    public Guid RuleId { get; set; } 

    [ForeignKey("AssociationId")] 
    public virtual Association Association { get; set; } 
    [ForeignKey("RuleId")] 
    public virtual Rule Rule { get; set; }   

    public Association() 
     : base() 
    { 
    } 
} 

現在,您可以輕鬆地從任何關聯中刪除的任何規則:

public ActionResult DeleteRule(Guid assId, Guid ruleId) 
{ 
    AssociationRule assr = this.DataContext 
     .AssociationRuless 
     .FirstOrDefault(ar => ar.AssociationId == assId && ar.RuleId == ruleId); 

    this.DataContext.AssociationRules.Remove(assr); 
    this.DataContext.SaveChanges(); 

    return RedirectToAction("Index"); 
} 
+0

我明白你要去哪裏了,但這是什麼意思,只是說 Rule rule = this.DataContext.Rules.FirstOrDefault(r => r.RuleId) this.DataContext.Remove(規則) 這也適用。 問題是我想只更新「所有父」=關聯 所以 關聯ass = this.DataContext.Associations.FirstOrDefault(a => a.Id == assId); ass.Rules.RemoveAll(r => r.Id == ruleId); this.DataContext.SaveChanges(); –

+0

@ThomasGielissen - 不,那不行。因爲'Rule'本身就是'Action'的父項。如果動作表中的規則的外鍵不可空,則無法對某些規則執行刪除。另一方面,通過刪除您的方法中的規則,您將失去Rule實體!但在我的方法中,你只是打破了「協會」和規則之間的關係,沒有任何其他問題或副作用。 – AminSaghi