假设在实体框架中,我有以下模型:
public class User
{
public int UserId { get; set; }
public string Name { get; set; }
public virtual ICollection<Item> Items { get; set; }
}
public class Item
{
public int ItemId { get; set; }
public string Name { get; set; }
public virtual User User{ get; set; }
}
用户可以拥有多个项目,但项目只有一个用户。 现在在asp web api中,我创建了一个用户和一个带有POST请求的项目:例如,对于用户,我有使用此方法的UsersController:
public IHttpActionResult PostUser(User user)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.Users.Add(user);
db.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = user.Id }, user);
}
现在如果我想更新创建的用户,为他分配创建的项目,我该如何实现呢?我必须在UsersController上调用PUT方法吗?什么是请求主体json对象?
由于
答案 0 :(得分:2)
ASP.NET MVC通常会将对象发送到操作并更新这样的实体:
public IHttpActionResult Edit(User user)
{
try
{
if (ModelState.IsValid)
{
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
}
}
catch (Exception e)
{
}
}
但是如果你有一个复杂的对象,它包含某种存储在DB中的另一个复杂对象的列表,Entity Framework会将EntityState.Modified设置为所有实体图形和项目,存储在列表中将再次保存。
因此,在我的实践中,我发送的对象没有包含列表,更新操作如下所示:
public IHttpActionResult Edit(User user)
{
try
{
User original = db.FirstOrDefault(u=>u.Id==user.Id);
original.Name = user.Name;
if (ModelState.IsValid)
{
db.Entry(original).State = EntityState.Modified;
db.SaveChanges();
}
}
catch (Exception e)
{
}
}
答案 1 :(得分:0)
我相信你会触及更常见的问题,即如何在断开连接的场景中使用Entity Framework(n层架构)。在这种情况下的基本问题是你失去了EF的好功能,即自动更改跟踪。因此,你必须自己实现它。实际上,这意味着在执行SaveChanges()方法之前,必须为图中的每个对象设置适当的EntityState。
您可以找到一些涵盖此主题的文章和讨论,它们可以帮助您设计体系结构。 e.g:
http://blog.magnusmontin.net/2013/05/30/generic-dal-using-entity-framework/
我的经验是基于EF 4,但我看到上面的链接,我认为EF仍然在这方面受到影响:
答案 2 :(得分:0)
您可能有兴趣使用在服务器端使用Entity Framework的开源N-Tier Entity Framework并生成整个基础架构,用于构建基于WCF的n层架构,包括客户端的类似EF的API 。但是,此框架要求您的客户端使用WCF而不是WebAPI。