Entity framework 实体框架6保存实体时的主键配置问题
我试图用以下代码保存几个实体:Entity framework 实体框架6保存实体时的主键配置问题,entity-framework,wcf-ria-services,Entity Framework,Wcf Ria Services,我试图用以下代码保存几个实体: this.UserService.Users.Add(eUser); if (SelectedRewindItems != null && SelectedRewindItems.Count > 0) { foreach (var ug in SelectedRewindItems) { HpmModel.Usergroup nUg = new HpmModel.Usergroup();
this.UserService.Users.Add(eUser);
if (SelectedRewindItems != null && SelectedRewindItems.Count > 0)
{
foreach (var ug in SelectedRewindItems)
{
HpmModel.Usergroup nUg = new HpmModel.Usergroup();
decimal numId;
var a = Decimal.TryParse(ug.Key.ToString(), out numId);
nUg.Groupid = numId;
nUg.Userid = eUser.Userid;
// eUser.Usergroups.Add(nUg);
this.UserService.Usergroups.Add(nUg);
}
}
var submitOp = this.UserService.SubmitChanges();
IsSuccess = true;
ActionMessageOnButtonSuccess = User.Fname + " " + User.Lname + " Added Successfully !!";
string message = null;
if (submitOp.EntitiesInError.Any())
{
message = string.Empty;
Entity entityInError = submitOp.EntitiesInError.First();
if (entityInError.EntityConflict != null)
{
EntityConflict conflict = entityInError.EntityConflict;
foreach (var cm in conflict.PropertyNames)
{
message += string.Format("{0}", cm);
}
}
else if (entityInError.ValidationErrors.Any())
{
message += "\r\n" + entityInError.ValidationErrors.First().ErrorMessage;
}
MessageBox.Show(message);
}
else
{
MessageBox.Show("Submit Done");
}
但我得到了一个错误:
System.InvalidOperationException未由用户代码处理HResult=-2146233079
Message=已成功提交对数据库的更改,但更新对象上下文时出错。ObjectContext可能处于不一致的状态 内部异常消息:保存或接受更改失败,因为“HpmModel.Usergroup”类型的多个实体具有相同的主键值。确保显式设置的主键值是唯一的。确保在数据库和实体框架模型中正确配置了数据库生成的主键。使用实体设计器进行数据库优先/模型优先配置。使用“HasDatabaseGeneratedOption”fluent API或“DatabaseGeneratedAttribute”进行代码优先配置 Source=EntityFramework 堆栈跟踪: 位于System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions选项、IDBEcutionStrategy executionStrategy、Boolean startLocalTransaction) 在System.Data.Entity.Core.Objects.ObjectContext.c__DisplayClass2a.b__27()中 在System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute[TResult](Func
1操作)中
位于System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions选项,布尔值executeInExistingTransaction)
位于System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions)
位于System.Data.Entity.Core.Objects.ObjectContext.SaveChanges()处
在OpenRiaServices.DomainServices.EntityFramework.LinqToEntitiesDomainService
1.调用c:\code\Repos\OpenRiaServices\OpenRiaServices.DomainServices.EntityFramework\Framework\LinqToEntitiesDomainService.cs中的VeChanges(布尔retryOnConflict):第145行
在c:\Code\Repos\OpenRiaServices\OpenRiaServices.DomainServices.EntityFramework.LinqToEntitiesDomainService`1.PersistChangeSet()中的OpenRiaServices.DomainServices.EntityFramework\Framework\LinqToEntitiesDomainService.cs:第138行
在OpenRiaServices.DomainServices.Server.DomainService.PersistChangeSetInternal()上
在OpenRiaServices.DomainServices.Server.DomainService.Submit(变更集变更集)上
InnerException:System.InvalidOperationException
HResult=-2146233079
Message=保存或接受更改失败,因为“HpmModel.Usergroup”类型的多个实体具有相同的主键值。请确保显式设置的主键值是唯一的。确保在数据库和实体框架模型中正确配置了数据库生成的主键。请对数据库使用实体设计器第一个/模型优先配置。使用“HasDatabaseGeneratedOption”fluent API或“DatabaseGeneratedAttribute”进行代码优先配置。
Source=EntityFramework
堆栈跟踪:
位于System.Data.Entity.Core.Objects.ObjectStateManager.FixupKey(EntityEntry)
位于System.Data.Entity.Core.Objects.EntityEntry.AcceptChanges()处
位于System.Data.Entity.Core.Objects.ObjectContext.AcceptillChanges()处
位于System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions选项、IDBEcutionStrategy executionStrategy、Boolean startLocalTransaction)
内部异常:
当我检查数据库时,实体被保存了,但它仍然给了我这个问题
这是因为我试图在分别保存用户和用户组实体之后保存它们。或子实体应与父实体一起保存。我是一个初学者,因此面临挑战。在浪费了很多时间之后,我开始知道我需要修复我的EDMX文件和实体代码。 因此,我在我的实体中添加了:
[DatabaseGenerated( DatabaseGeneratedOption.Identity)]
在我的用户->用户组(1-M)关系中的SSDL文件中
我添加的Usersgroup Id节点:
StoreGeneratedPattern="Identity" [SSDL]
在CSDL中:
ed:StoreGeneratedPattern="Identity"
在我的代码中:
this.UserService.Users.Add(eUser);
if (SelectedRewindItems != null && SelectedRewindItems.Count > 0)
{
foreach (var ug in SelectedRewindItems)
{
HpmModel.Usergroup nUg = new HpmModel.Usergroup();
decimal numId;
var a = Decimal.TryParse(ug.Key.ToString(), out numId);
nUg.Groupid = numId;
nUg.Userid = eUser.Userid;
eUser.Usergroups.Add(nUg);
}
}
应用这些更改后,SaveChanges()
起作用
这对我很有帮助。任何一个帮助请查看我的问题我在使用Oracle数据库时也遇到了同样的问题。PK在插入触发器上自动递增,但EF6抱怨设置了重复的PK条目。我必须将模型中的所有PK属性更改为“StoreGeneratedPattern”=>Identity(替换为“none”)。保存我的屁股兄弟。我在最后两个小时搜索@阿基尔蒂