Entity Framework 5.0代码首先进行多对多更新

斯里尼瓦斯

我在Apple和Orange桌子之间有很多对很多的关系。

public class Apple
{
    [Key]
    public int AppleID { get; set; }

    [Required]
    public string AppleName { get; set; }

    [NotMapped]
    public int[] SelectedOranges { get; set; }

    public virtual ICollection<Orange> Oranges { get; set; }

}

public class Orange
{

    [Key]
    public int OrangeID { get; set; }
    public String OrangeName { get; set; }
    public virtual ICollection<Apple> Apples { get; set; }
}

在Data Context类中,OnModelCreating方法被重写,如下所示

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        //----------------------------------------------------------------
        //Creating a Association (Intermediate Table) which
        //will hold M2M relations from Student to Course.
        //----------------------------------------------------------------

        modelBuilder.Entity<Apple>()
            .HasMany(c => c.Oranges)
            .WithMany(t => t.Apples);
    }

当我在ASP.NET MVC应用程序中从控制器保存编辑后的值时,出现以下异常:

保存不公开外键属性为其关系的实体时发生错误。EntityEntries属性将返回null,因为无法将单个实体标识为异常的来源。通过在实体类型中公开外键属性,可以简化保存时的异常处理。有关详细信息,请参见InnerException。

内部例外是:

违反主键约束'PK_dbo.AppleOranges'。无法在对象'dbo.AppleOranges'中插入重复的密钥。重复的键值为(1,3)。\ r \ n该语句已终止。

任何的想法?

AppleController:

    //
    // GET: /Apple/Edit/5

    public ActionResult Edit(int id = 0)
    {

        Apple Apple = db.Apples.Find(id);
        if (Apple == null)
        {
            return HttpNotFound();
        }
        var selectedvalues = new List<Orange>();
        Apple.SelectedOranges = new int[Apple.Oranges.Count];
        int j=0;
        foreach (var i in Apple.Oranges)
        {
            selectedvalues.Add(i);
            Apple.SelectedOranges[j++] = db.Oranges.ToList().IndexOf(i)+1;
        }
        ViewBag.OrangesList = new MultiSelectList(db.Oranges, "OrangeID", "OrangeName", selectedvalues);
        return View(Apple);
    }

    //
    // POST: /Apple/Edit/5

    [HttpPost]
    public ActionResult Edit(Apple Apple)
    {
        if (ModelState.IsValid)
        {
            db.Entry(Apple).State = EntityState.Modified;
            foreach (var i in Apple.SelectedOranges)
            {
                if (Apple.Oranges == null)
                    Apple.Oranges = new List<Orange>();
                Apple.Oranges.Add(db.Oranges.Find(i));
            }
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        ViewBag.OrangesList = new MultiSelectList(db.Oranges, "OrangeID", "OrangeName", Apple.SelectedOranges);
        return View(Apple);
    }

Apple编辑视图:

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)

<fieldset>
    <legend>Apple</legend>

    @Html.HiddenFor(model => model.AppleID)

    <div class="editor-label">
        @Html.LabelFor(model => model.AppleName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.AppleName)
        @Html.ValidationMessageFor(model => model.AppleName)
    </div>


    <div class="editor-label">
        @Html.LabelFor(model => model.Oranges)
    </div>
    <div class="editor-field">
        @Html.ListBoxFor(m=>m.SelectedOranges,(MultiSelectList)ViewBag.OrangesList)
        @Html.ValidationMessageFor(model => model.Oranges)
    </div>

    <p>
        <input type="submit" value="Save" />
    </p>
</fieldset>

}

格特·阿诺德

您必须先加载Apple.Oranges,然后再向其中添加项目。如果加载了集合,EF的变更跟踪器将知道哪些关联是新的,哪些已经存在,并且仅新的关联将被保存。

您可以通过以下方式加载收藏集

db.Entry(Apple).Collection(a => a.Oranges).Load()

您可以删除代码

if (Apple.Oranges == null)
    Apple.Oranges = new List<Orange>();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

首先在同一张表中启用Entity Framework 5代码中的多对多

首先,Entity Framework 5代码无法使模型正常工作

为什么Entity Framework 5代码优先不映射我的枚举属性?

使用Entity Framework 5代码优先的MVC4图像上传

在Entity Framework核心中更新多对多

Entity Framework Core 代碼首先使用外鍵進行多對多保存

首先使用Entity Framework 6代码初始化数据库

首先使用Entity Framework Core 2代码创建varchar

使用MVC 5和Entity Framework 6进行挣扎

使用Entity Framework 5更新数据库字段

使用Entity Framework 5错误和DbUpdateConcurrencyException更新记录

更新和编辑多对多表Entity Framework

Entity Framework Core 5:配置多对多关系,如何指定外键名

在Entity Framework 6.1中添加列-多对多-代码优先

首先在哪里可以找到Entity Framework 4.0代码中的.csdl,.ssdl和.msl文件?

如何首先在Entity Framework Core 2.0代码中按类型继承创建Table?

首先使用Entity Framework 6.1代码持久化和检索序列化的实体属性

首先使用Entity Framework 6代码:将字符串属性的unicode设置为false

首先使用代码在Entity Framework Timestamp中查找更新的条目

无法在Entity Framework 5中检索OriginalValues

MVC5代码首先将用户添加到多对多关系

Entity Framework Core - 多对多“影子查询”

如何使用 Entity Framework Core 5 中的自定义列进行 SQL 查询

使用 Entity Framework Core 5,如何在调用 SaveChanges() 时自动更新相关实体?

Entity Framework Core 创建多对多关系

在Entity Framework中以多对多关系更新记录

更新Entity Framework Core中的多对多关系

SQL Server上的Entity Framework 6代码优先:将“布尔”映射为“数字(1,0)”而不是“位”

要在Entity Framework中编辑多对多关系,为什么必须首先清除该集合?