我在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] 删除。
我来说两句