Asp.net mvc 水合物相关物体
我正在寻找一种简单的方法来水合一个相关的对象。注释属于文档,只有文档的所有者才能添加注释,因此当用户尝试编辑注释时,我需要查看相关文档,以确定用户是否有权访问它。在我的服务层中,我有以下内容:Asp.net mvc 水合物相关物体,asp.net-mvc,asp.net-mvc-3,entity-framework,poco,Asp.net Mvc,Asp.net Mvc 3,Entity Framework,Poco,我正在寻找一种简单的方法来水合一个相关的对象。注释属于文档,只有文档的所有者才能添加注释,因此当用户尝试编辑注释时,我需要查看相关文档,以确定用户是否有权访问它。在我的服务层中,我有以下内容: public void editNote(Note note) { // Get the associated Document object (required for validation) and validate. int docID = noteRepos
public void editNote(Note note)
{
// Get the associated Document object (required for validation) and validate.
int docID = noteRepository.Find(note.NoteID).DocumentID;
note.Document = documentRepository.Find(docID);
IDictionary<string, string> errors = note.validate();
if (errors.Count > 0)
{
throw new ValidationException(errors);
}
// Update Repository and save.
noteRepository.InsertOrUpdate(note);
noteRepository.Save();
}
public void InsertOrUpdate(Note note)
{
if (note.NoteID == default(int)) {
// New entity
context.Notes.Add(note);
} else {
// Existing entity
//context.Entry(note).State = EntityState.Modified;
context.Entry(oldNote).CurrentValues.SetValues(note);
}
}
但是我如何从上下文中得到旧音符呢?我可以调用context.Entry(Find(note.NoteID)).CurrentValues.SetValues(note),但我在这里引入了潜在的问题吗
我是否正确地处理了这个问题?如果是,我如何避开这个异常
我猜这部分代码将从数据库加载整个节点以查找DocumentID:
int docID = noteRepository.Find(note.NoteID).DocumentID;
在这种情况下,InsertOrUpdate无法获取节点并将其附加到具有修改状态的上下文,因为上下文中已经有具有相同键的Notes。常见的解决方案是使用以下方法:
objectContext.NoteSet.ApplyCurrentValues(note);
objectContext.SaveChanges();
但对于编辑,我不能使用它,因为恶意用户可以提供他们确实有权访问的DocumentID,从而编辑他们不拥有的便笺
在这种情况下,您必须添加一些安全性。您可以将任何数据添加到页面中的隐藏字段中,但是客户端不能更改的数据必须包含一些额外的安全性。例如,在服务器上计算签名或在服务器上计算附加值哈希的第二个隐藏字段。当数据在下一个请求中返回到服务器时,它必须重新计算签名/哈希并与相同的salt进行比较,并验证传递的值和计算的值是否相同。确保客户不知道您用于计算签名或哈希中使用的salt的秘密
我已经读到,我应该将一个文档存储库作为一个集合,然后丢失注释存储库,但不确定这是否/如何有帮助
这是使用存储库的更干净的方法,但它不会帮助您解决特定错误,因为您仍然需要
Note
和DocumentId
请给我举一个objectContext.NoteSet.ApplyCurrentValues(Note)的例子好吗?我不能100%确定我需要在这里做什么,因为我在集合中没有看到可用的ApplyCurrentValues方法。您使用的是什么版本的EF?EF 4.0。我已经用repository方法编辑了我的问题。这就是你的意思吗?那不是EF4.0。这是EF4.1或4.2(DbContext API)。哎呀,是的,对不起。4.2. 它似乎有效,正确地更新了记录等,但对于调用回购有点不安。查找以获取旧便条。这个方法行吗?或者有没有办法让上下文给我旧便笺?是的,context.Find
方法是您要寻找的,因为要使此工作,必须在更新之前加载旧便笺,同时Find first检查它是否已加载,并且仅当它在当前上下文中找不到时才进行db查询。