我正在使用Web API 2和Entity Framework 6以及Identity 2
我有与ApplicationUser
模型相关的产品型号,我在其中创建Product
,我收到错误:
附加信息:IEntityChangeTracker的多个实例无法引用实体对象。
我的模特:
public class Product {
public int id { get; set; }
public string url { get; set; }
public string name {get;set}
public ApplicationUser user { get; set; }
}
我的创建代码:
public IHttpActionResult PostProduct(Product product) {
ApplicationUserManager userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(new ApplicationDbContext()));
product.user = userManager.FindById(User.Identity.GetUserId());
if (!ModelState.IsValid) {
return BadRequest(ModelState);
}
db.Products.Add(product);
db.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = product.id }, product);
}
答案 0 :(得分:0)
dbcontext做什么&#34; db&#34;参考?
我猜你可能有多个dbcontext而且你正在尝试从一个dbcontext中检索数据并将其保存在另一个上。
也许您可以更改代码,以便为每个http请求创建一个dbcontext,并在http post请求期间重用该上下文。
也许改变:
ApplicationUserManager userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(new ApplicationDbContext()));
为:
ApplicationUserManager userManager = new ApplicationUserManager(new UserStore<ApplicationUser>(db));
这样可以保存您的产品,但应避免发回EF对象,或至少关闭延迟加载。
为了澄清一点,不要在返回时发送product
,因为它包含作为延迟加载的EF代理的属性。这最多会导致比序列化产品对象时要返回的数据多得多 - 最糟糕的是 - 您在评论中描述的错误。