Violation of primary key Entity Framework Code First

∥☆過路亽.° 提交于 2019-11-29 14:07:51

Your comment reveals vital information. When you add that AModel from your combobox to your BModel, it will have become detached from your DbContext by then. When you then add it to your model, Entity Framework will think that you have a new object.

Since you have your Ids configured as DatabaseGenerationOptions.None, it will use the primary key you provide yourself. In your case this is the PK of the detached object. Thus, when EF tries to insert this entry it will throw the above exception because an entity with that key is already in there.

There are a few ways to solve this:

  • Retrieve the existing entity

This entity will be attached to your context upon retrieval, allowing you to use this. This means an extra lookup however: first to get them into the combobox and then to use the Id from the entity in the combobox to retrieve it again from the database.

Example usage:

AModel Get(AModel detachedModel)
{
    using(var context = new MyContext())
    {
        return context.AModels.Single(x => x.ID == detachedModel.ID);
    }
}
  • Attach the existing model

This should just make Entity-Framework aware that the entity already exists in the database.

using(var context = new MyContext())
{
    context.AModels.Attach(detachedModel);
}

Other ways to attach is by setting the state to Unchanged

context.Entry(detachedModel).State = EntityState.Unchanged;

or Modified (in case you also changed values)

context.Entry(detachedModel).State = EntityState.Modified;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!