Asp.net mvc 4 实体框架代码首先,通过更新父项删除子项

Asp.net mvc 4 实体框架代码首先,通过更新父项删除子项,asp.net-mvc-4,ef-code-first,entity-framework-5,Asp.net Mvc 4,Ef Code First,Entity Framework 5,正如实体框架所述,代码优先,这里我们先使用代码 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();

正如实体框架所述,代码优先,这里我们先使用代码

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()
    {
    }
}
在context.savechanges上,出现以下错误: '操作失败:无法更改关系,因为一个或多个外键属性不可为null。对关系进行更改时,相关外键属性设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。”

删除操作时也会发生此错误

是否有一种方法可以更改最上层的关联对象,并且只更改此关联的内容。 我不想说上下文。规则。删除。。。或上下文。操作。删除

以下是消息来源: 您需要VS2012,所有nuget软件包都包含在zip中,您应该能够构建和运行该项目

提前感谢您的反馈

格里茨,
Thomas

如果要解决此问题,应通过连接表存储关系。我不认为用这种模式你能达到你所需要的

但是,如果在实体之间放置连接表或实体,则可以轻松删除子对象并更新父对象

例如,在关联和规则之间放置连接实体:

现在,您可以轻松地从任何关联中删除任何规则:

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");
}

你需要重新格式化这个问题。简化您的问题描述,并在文章中包含最少的相关代码。就目前情况而言,您不太可能得到帮助。问题已更新!,希望我现在能得到帮助:我知道你要做什么了,但是这和刚才说的Rule-Rule=this.DataContext.Rules.FirstOrDefaultr=>r.RuleId this.DataContext.com有什么不同呢?这也行得通。问题是我只想更新all=Association的父级,因此Association ass=this.DataContext.Associations.FirstOrDefaulta=>a.Id==assId;ass.Rules.RemoveAllr=>r.Id==ruleId;this.DataContext.SaveChanges@托马斯吉利森-不,那不行。因为规则是动作本身的父级。如果操作表中规则的外键不可为空,则无法对某些规则执行删除操作。另一方面,通过删除方法中的规则,您将失去规则实体!但在我的方法中,你只是打破了关联和规则之间的关系,没有任何其他问题或副作用。
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");
}