外键约束,EF与childobjects的集合(Foreign key constraint, EF

2019-07-28 23:45发布

我试图更新模型,但得到的错误“操作失败:关系不能被改变,因为一个或多个外键的属性是不可为空当的改变有关系作出的相关。外键属性设置为空值,如果外键不支持空值,新的关系必须定义,外键属性必须指定一个非空值,或者无关的对象必须被删除“。

据我了解,从的关系无法改变,因为一个或多个外键的属性是不可为空的问题,可能与实体框架是如何处理我的虚拟的ICollection

但是我真的不知道如何使用脚手架库模式时,实施解决方案。 我一定要编辑保存() - 方法ParentObjectRepository级?

其实我真的觉得必须有一些方法,使EF明白这一点。 我看不到EF-队怎么想“也许没有人使用对象的集合与外键约束,让不支持”。

更新添加的代码

[HttpPost]
public ActionResult Edit(int id, FormCollection formCollection)
{
    var eventRepository = new MagnetEventRepository();
    var original = eventRepository.Find(id);
    UpdateModel(original);
    eventRepository.Save();
    return RedirectToAction("Details", "Home", new { slug = original.Slug });
}

public void Save()
{
    context.SaveChanges();
}

更多的代码:

public class MagnetEvent
{
    public virtual int Id { get; set; }

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

    [Required]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd HH:mm}")]
    [DataType(DataType.DateTime)]
    public virtual DateTime? StartDate { get; set; }

    public virtual string Description { get; set; }

    [StringLength(100)]
    public virtual string Slug { get; set; }

    public virtual int MaximumCapacity { get; set; }

    [DataType(DataType.Currency)]
    public virtual int TicketPrice { get; set; }

    public virtual int LocationId { get; set; }
    public virtual Location Location { get; set; }

    public virtual Collection<Ticket> Tickets { get; set; }

    public virtual Collection<AttendeeInformationField> CaptureAttendeeInformationFields { get; set; }

    public virtual int CustomerId { get; set; }

    [Required]
    public virtual CUSTOMER Customer { get; set; }
}

保存() - 方法是从MagnetEventRepository,它是从上述的类脚手架。

另一个更新我成功地在AttendeeInformationField改变MagnetEventId可空INT删除的错误。 当检查数据库中,我可以清楚地看到什么是错的。

比方说,我有值“电子邮件”一单AttendeeInformationField。 当我编辑MagnetEvent,该AttendeeInformationField更新MagnetEventId为空,然后添加一个新的职位以正确的MagnetEventId和价值。

我很喜欢多如果AttendeeInformationField的职位,而不是更新。

Answer 1:

你可以添加代码为您的活动对象。 你叫原来的一个。

这可能是使的UpdateModel改变对关联对象的一些信息,如果所以这是不好的。 不知道这虽然我不能看到所有的代码。

我宁愿不乌德UptadeModel,而是使用一个inputmodel或你的MVC模型作为inparameter和手动chages映射到加载的原始对象。

Antoher问题是,我不能,如果eventRepository.Save看到();

真正做一个SaveShages? 可以? 我可以在自身的另一种方法有些情况下代码保存?



Answer 2:

作为例外,说这接缝喜欢你的关联集合或其他相关的对象不能找到有效的ID值。

你是不是很想加载相关的对象吗? 如客户?



Answer 3:

一个值得注意的事情是,你不应该有[必需]对客户从一个事实,即你的FK不能为空的推断。 必应只有一个导航属性可以使用,如果你不具备FK模型。

要尝试诊断问题,您可以加载对象,看看它在一个调试器,你应该想到,这两个locationId和客户编号有非零值。



Answer 4:

我发现了一个解决我的问题。 这似乎是在ASP.NET MVC中的错误(?),当它涉及到的UpdateModel和含有ICollection的模型。

解决的办法是覆盖默认行为,因为在这个博客帖子描述: http://www.codetuning.net/blog/post/Binding-Model-Graphs-with-ASPNETMVC.aspx

更新我发现了一个解决方案! 更新集合中的现有项目时,以上只是工作。 为了解决这个问题,我必须手动检查并添加新的AttendeeInformationFields。 像这样:

[HttpPost]
public ActionResult Edit(int id, MagnetEvent magnetEvent)
{
    var eventRepository = new MagnetEventRepository();
    var original = eventRepository.Find(id);
    UpdateModel(original);
    foreach (var attendeeInformationField in magnetEvent.CaptureAttendeeInformationFields)
    {
        var attendeeInformationFieldId = attendeeInformationField.Id;
        if (original.CaptureAttendeeInformationFields.AsQueryable().Where(ai => ai.Id == attendeeInformationFieldId).Count() == 0)
        {
            original.CaptureAttendeeInformationFields.Add(attendeeInformationField);
        }
    }
    eventRepository.Save();
}

再加上修改DefaultModelBinder,这实际上既编辑和添加工作。 现在我还没有试过删除。

不过,我希望有一个更简单的方法来做到这一点。 好像很多编码做一个非常基本的任务。



文章来源: Foreign key constraint, EF with collection of childobjects