我在尝试更新相关实体时收到错误消息。
创建新的时候可以。
错误消息说:
发生了引用完整性约束违规:定义的属性值 参照约束在关系中的主体和依赖对象之间不一致。
请查看我的代码,并告诉我我做错了什么。
首先,DB是Mysql MyISAM。
实体类
[Table("note")]
public class Note
{
[Key]
public int id { get; set; }
[Required(ErrorMessage="Content is required")]
[DisplayName("Note")]
public string content { get; set; }
public DateTime date { get; set; }
[Required(ErrorMessage = "User ID is required")]
[DisplayName("User ID")]
public string userId {get; set;}
public Boolean isPrivate { get; set; }
[DisplayName("Attach File")]
public virtual ICollection<AttachedFile> AttachedFiles { get; set; }
}
[Table("attachedfile")]
public class AttachedFile
{
[Key]
public int id { get; set; }
public int noteId { get; set; }
public string fileName { get; set; }
}
控制器,
[HttpPost]
public ActionResult Index(Note note, HttpPostedFileBase attFile)
{
try
{
if (ModelState.IsValid)
{
updateAttachFile(note, attFile);
if (note.id > 0)
{
unitOfWork.NoteRepository.UpdateNote(note);
}
else
{
unitOfWork.NoteRepository.InsertNote(note);
}
unitOfWork.Save();
return RedirectToAction("Index");
}
}catch(DataException){
ModelState.AddModelError("", "Unable to save changes. Try again please");
}
var notes = unitOfWork.NoteRepository.GetNotes();
return View(new NoteViewModel() { noteList = notes.ToList(), note = new Note() });
}
private void updateAttachFile(Note note,HttpPostedFileBase attFile)
{
if (attFile == null) return;
List<AttachedFile> list;
if (note.id > 0)
{
list = unitOfWork.AttachedFileRepository.Get(filter: q => q.noteId.Equals(note.id)).ToList();
}
else
{
list = new List<AttachedFile>();
}
var fileName = Path.GetFileName(attFile.FileName);
fileName = fileName.Replace(" ", "");
fileName = Regex.Replace(fileName, @"\s|\$|\#\%", "");
var path = Path.Combine(Server.MapPath("~/App_data/uploads"), fileName);
attFile.SaveAs(path);
list.Add(new AttachedFile
{
fileName = fileName
});
note.AttachedFiles = list;
}
}
答案 0 :(得分:1)
通过将note
的状态设置为Modified
,EF会将相关实体(尤其是新创建的AttachedFile
)附加到上下文,但状态为Unchanged
。您没有设置正确的外键属性值(如果实体不在状态Added
中,则必须这样做)。这样做会删除异常:
list.Add(new AttachedFile
{
noteId = note.id,
fileName = fileName
});
但是您的新AttachedFile
将不会添加到您的数据库中,因为它不在Added
州。
如果您在更新/插入后调用updateAttachFile
,我希望这是有效的。
if (note.id > 0)
unitOfWork.NoteRepository.UpdateNote(note);
else
unitOfWork.NoteRepository.InsertNote(note);
updateAttachFile(note, attFile);
unitOfWork.Save();
...因为SaveChanges
中发生的更改检测会识别新实体并自动将其置于Added
状态。
作为旁注:我不知道你为什么用unitOfWork.AttachedFileRepository.Get...
加载现有的AttachedFiles。对于Update和Insert两种情况,它应该在我看来是空的list
。