我有这两个对象 - 杂志和作者(MM 关系):
public partial class MAGAZINE
{
public MAGAZINE()
{
this.AUTHORs = new HashSet<AUTHOR>();
}
public long REF_ID { get; set; }
public string NOTES { get; set; }
public string TITLE { get; set; }
public virtual REFERENCE REFERENCE { get; set; }
public virtual ICollection<AUTHOR> AUTHORs { get; set; }
}
public partial class AUTHOR
{
public AUTHOR()
{
this.MAGAZINEs = new HashSet<MAGAZINE>();
}
public long AUTHOR_ID { get; set; }
public string FULL_NAME { get; set; }
public virtual ICollection<MAGAZINE> MAGAZINEs { get; set; }
}
}
我的问题是我似乎无法根据杂志更新作者的数量,例如,如果我有 1 位作者名为“Smith, P”。已经存储在一本杂志上,我可以添加另一个名为“Jones, D.”的文章,但在发回编辑控制器后,作者的数量仍然显示为 1 - 即“Smith, PH”。
请不要说我已经成功地将作者的数量绑定回父实体(杂志),它使用自定义模型绑定器来检索作者并绑定到杂志(我认为),但它似乎仍然没有更新适当地。
我更新模型的代码很简单 - 并显示之前和之后的变量值:
public ActionResult Edit(long id)
{
MAGAZINE magazine = db.MAGAZINEs.Find(id);
return View(magazine);
}
这里是变量预编辑/更新 -
[HttpPost]
public ActionResult Edit(MAGAZINE magazine)
{
if (ModelState.IsValid)
{
db.Entry(magazine).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(magazine);
}
...这是添加新作者后的变量...
我开始怀疑作者实体正在显示,编辑后它没有绑定到任何杂志,我猜这就是为什么它没有被更新回杂志实体 - 但它令人困惑,因为我正在有效地处理同一杂志实体 - 我想这可能与作者的自定义模型活页夹有关。
任何人都可以帮助解决这个问题吗?
为了完整性-我也包含了我的 AuthorModelBinder 类-
public class AuthorModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var values = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (values != null)
{
// We have specified asterisk (*) as a token delimiter. So
// the ids will be separated by *. For example "2*3*5"
var ids = values.AttemptedValue.Split('*');
List<int> validIds = new List<int>();
foreach (string id in ids)
{
int successInt;
if (int.TryParse(id, out successInt))
{
validIds.Add(successInt);
}
else
{
//Make a new author
AUTHOR author = new AUTHOR();
author.FULL_NAME = id.Replace("\'", "").Trim();
using (RefmanEntities db = new RefmanEntities())
{
db.AUTHORs.Add(author);
db.SaveChanges();
validIds.Add((int)author.AUTHOR_ID);
}
}
}
//Now that we have the selected ids we could fetch the corresponding
//authors from our datasource
var authors = AuthorController.GetAllAuthors().Where(x => validIds.Contains((int)x.Key)).Select(x => new AUTHOR
{
AUTHOR_ID = x.Key,
FULL_NAME = x.Value
}).ToList();
return authors;
}
return Enumerable.Empty<AUTHOR>();
}
}