实体框架6保存实体时的主键配置问题

时间:2014-09-15 15:46:27

标签: 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();
                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”的实体具有相同的主键值。确保显式设置的主键值是唯一的。确保在数据库和Entity Framework模型中正确配置了数据库生成的主键。使用实体设计器进行数据库优先/模型优先配置。使用'HasDatabaseGeneratedOption'流畅API或'DatabaseGeneratedAttribute'进行代码优先配置。

     

Source = EntityFramework

     

堆栈跟踪:          在System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions选项,IDbExecutionStrategy executionStrategy,Boolean startLocalTransaction)          在System.Data.Entity.Core.Objects.ObjectContext。<> c__DisplayClass2a.b__27()          at System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute [TResult](Func 1 operation) at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options, Boolean executeInExistingTransaction) at System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions options) at System.Data.Entity.Core.Objects.ObjectContext.SaveChanges() at OpenRiaServices.DomainServices.EntityFramework.LinqToEntitiesDomainService 1.InvokeSaveChanges(Boolean retryOnConflict)在c:\ Code \ Repos \ openriaservices \ OpenRiaServices.DomainServices.EntityFramework \ Framework \ LinqToEntitiesDomainService.cs :第145行          at c:\ Code \ Repos \ openriaservices \ OpenRiaServices.DomainServices.EntityFramework \ Framework \ LinqToEntitiesDomainService.cs中的OpenRiaServices.DomainServices.EntityFramework.LinqToEntitiesDomainService`1.PersistChangeSet():第138行          在OpenRiaServices.DomainServices.Server.DomainService.PersistChangeSetInternal()          在OpenRiaServices.DomainServices.Server.DomainService.Submit(ChangeSet changeSet)          InnerException:System.InvalidOperationException          的HResult = -2146233079          消息=保存或接受更改失败,因为多个类型为“HpmModel.Usergroup”的实体具有相同的主键值。确保显式设置的主键值是唯一的。确保在数据库和Entity Framework模型中正确配置了数据库生成的主键。使用实体设计器进行数据库优先/模型优先配置。使用'HasDatabaseGeneratedOption'流畅API或'DatabaseGeneratedAttribute'进行Code First配置。          来源=的EntityFramework          堆栈跟踪:               在System.Data.Entity.Core.Objects.ObjectStateManager.FixupKey(EntityEntry条目)               在System.Data.Entity.Core.Objects.EntityEntry.AcceptChanges()               在System.Data.Entity.Core.Objects.ObjectContext.AcceptAllChanges()               在System.Data.Entity.Core.Objects.ObjectContext.SaveChangesToStore(SaveOptions选项,IDbExecutionStrategy executionStrategy,Boolean startLocalTransaction)          InnerException:

当我检查数据库实体已保存但仍然给我这个问题。

这是因为我在保存用户&然后,UserGroup实体分开。或子实体应与父实体一起保存。我是初学者,面对挑战。

1 个答案:

答案 0 :(得分:3)

浪费了很多时间之后,我才知道我需要修复我的EDMX文件&实体代码。 所以我在我的实体中添加了:

[DatabaseGenerated( DatabaseGeneratedOption.Identity)]

在我的用户的SSDL文件中 - >用户组(1-M)关系 用户组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()有效。

blog post帮助了我。