实体框架:将身份2用户与产品模型联系起来

时间:2015-03-01 21:03:24

标签: entity-framework asp.net-web-api2 asp.net-identity-2

我正在使用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);
}

1 个答案:

答案 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代理的属性。这最多会导致比序列化产品对象时要返回的数据多得多 - 最糟糕的是 - 您在评论中描述的错误。