实体框架 - 已添加具有相同密钥的项目. - 尝试定义外键关系时出错

Bro*_*Dev 8 .net linq linq-to-entities entity-framework entity-framework-4

我有一个与asp.net成员资格提供者用户表具有外键关系的实体.

这部分模型如下所示:

替代文字

在插入Users表记录时,我似乎无法分配外键关系,该记录包含aspnet_Users表的外键.我一直收到错误:

已添加具有相同键的项目.

我正在使用的代码如下:

UserAdmin userToAdd = new UserAdmin();
...
userToAdd.aspnet_Users = membershipUser;
//line above OR line below
userToAdd.aspnet_UsersReference.EntityKey = new System.Data.EntityKey("ProjectEntities.aspnet_Users", "UserId", membershipUser.UserId);

db.AddToUsers(userToAdd);
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

问题是我要求EF aspnet_Users在该记录已经存在时添加新的表记录(相关主键表的记录)?

如何将外键值分配给主键记录已存在的实体?

更新的测试代码块:

MembershipUser membershipUser = Membership.CreateUser("blah@blah.com", "pass", "blah@blah.com");

Entities db = new Entities();
UserAdmin newUser = new UserAdmin();
newUser.Name = "blah";
newUser.DateAdded = DateTime.Now;

Guid key = new Guid(membershipUser.ProviderUserKey.ToString());
aspnet_Users membershipUserRecord = db.aspnet_Users.Where(u => u.UserId == key).FirstOrDefault();
newUser.aspnet_Users = membershipUserRecord;
//newUser.aspnet_UsersReference.EntityKey = new System.Data.EntityKey("Entities.aspnet_Users", "UserId", membershipUserRecord.UserId);
db.ObjectStateManager.ChangeObjectState(membershipUserRecord, EntityState.Unchanged);

db.AddToUsers(newUser);
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

此代码生成错误:

已添加具有相同键的项目.

Bro*_*Dev 10

好的,我想出了这个.像往常一样,只是我犯了一个错误而没有马上抓住它,因为我看错了地方.

问题是由于我的表继承和数据库级别的配置.我将子表(UserAdmin)外键字段定义为标识,然后在我的模型中显示为StoreGeneratedPattern = Identity.当EF试图将父级主键传播到其子级的外键字段时,这导致"具有相同键的项目已添加错误".

一旦我从UserAdmins表中删除了身份规范,问题就消失了.

问题解决了.