Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF使用新引用更新现有实体并违反唯一键约束_C#_Sql_Asp.net Mvc_Database_Entity Framework - Fatal编程技术网

C# EF使用新引用更新现有实体并违反唯一键约束

C# EF使用新引用更新现有实体并违反唯一键约束,c#,sql,asp.net-mvc,database,entity-framework,C#,Sql,Asp.net Mvc,Database,Entity Framework,我正在尝试更新数据库实体(MamConfiguration\u V1)中的一个现有名称,称之为Parent 我想 1) 向其添加引用(导航)成员(MamConfigurationToBrowser_V1)并将其称为子级 2) 我不会更改父实体中唯一属性的值。(家长姓名) 我从数据库得到了要更新的实体 并使用相同的上下文(mmamdbenties) 我添加参考成员 我不会更改它的名称属性 然而,我得到了一个DB错误,唯一性限制违反 {"Violation of UNIQUE KEY constra

我正在尝试更新数据库实体(MamConfiguration\u V1)中的一个现有名称,称之为Parent

我想

1) 向其添加引用(导航)成员(MamConfigurationToBrowser_V1)并将其称为子级

2) 我不会更改父实体中唯一属性的值。(家长姓名)

我从数据库得到了要更新的实体

并使用相同的上下文(mmamdbenties)

我添加参考成员

我不会更改它的名称属性

然而,我得到了一个DB错误,唯一性限制违反

{"Violation of UNIQUE KEY constraint 'UQ_MamConfigurations_V1'. Cannot insert duplicate key in object 'dbo.MamConfiguration_V1'. The duplicate key value is (elad_14Apr_1315).\r\nThe statement has been terminated."}
我进行了DB嗅探,看到了生成的代码:

exec sp_executesql N'update [dbo].[MamConfiguration_V1]
set [Name] = @0, [Description] = @1, [StatusId] = @2, [Type] = @3, [UpdatedDate] = @4, [PercentageTraffic] = @5, [NumericTraffic] = @6
where ([ConfigurationId] = @7)
',N'@0 nvarchar(50),@1 nvarchar(200),@2 int,@3 int,@4 datetime2(7),@5 int,@6 int,@7 int',@0=N'elad_17Apr_1120_tmpToRemove_',@1=N'elad_22Apr_1120',@2=2,@3=0,@4='2013-04-23 11:17:25.4991650',@5=55,@6=-1,@7=32
//还有一些命令

exec sp_executesql N'insert [dbo].[MamConfiguration_V1]([Name], [Description], [StatusId], [Type], [CreatedDate], [UpdatedDate], [PercentageTraffic], [NumericTraffic])
values (@0, @1, @2, @3, @4, @5, @6, @7)
select [ConfigurationId]
from [dbo].[MamConfiguration_V1]
where @@ROWCOUNT > 0 and [ConfigurationId] = scope_identity()',N'@0 nvarchar(50),@1 nvarchar(200),@2 int,@3 int,@4 datetime2(7),@5 datetime2(7),@6 int,@7 int',@0=N'elad_17Apr_1120_tmpToRemove_',@1=N'elad_22Apr_1120',@2=2,@3=0,@4='0001-01-01 00:00:00',@5='0001-01-01 00:00:00',@6=55,@7=-1
我本以为upsert是
@@ROWCOUNT=0

我做错了什么

我的代码和数据库是:

        public void SaveCofiguration(MamConfiguration_V1Ui itemUi)
        {
            var itemEf = mMamConfiguration_V1UiToEfConvertor.ConvertToNewEf(itemUi);

            using (var maMDBEntities = new MaMDBEntities())
            {
                IDal<MamConfiguration_V1> mamConfigurationDal = mDalFactory.GetDal<MamConfiguration_V1>(maMDBEntities);

                mamConfigurationDal.Save(itemEf);
            }
        }

         public MamConfiguration_V1 GetById(object id)
        {           
                id.ThrowIfNull("id");

                int configurationId = Convert.ToInt32(id);

                var result =
                    mMaMDBEntities.MamConfiguration_V1.SingleOrDefault(item => item.ConfigurationId == configurationId);

                return result;

        }

       public MamConfiguration_V1 Save(MamConfiguration_V1 item)
        {

                item.ThrowIfNull("item");

                var itemFromDB = GetById(item.ConfigurationId);

                if (itemFromDB != null)
                {
                    UpdateEfItem(itemFromDB, item);

                   // if (mMaMDBEntities.ObjectStateManager.GetObjectStateEntry(itemFromDB).State == EntityState.Detached)
//                    {
  //                      mMaMDBEntities.MamConfiguration_V1.AddObject(itemFromDB);
    //                }

                    // Attached object tracks modifications automatically
                    mMaMDBEntities.SaveChanges();

                    return item;
                }





       private void UpdateEfItem(MamConfiguration_V1 itemFromDb, MamConfiguration_V1 itemFromUi)
            {
                itemFromDb.UpdatedDate = DateTime.Now;

                itemFromDb.Description = itemFromUi.Description;

                itemFromDb.StatusId = itemFromUi.StatusId;

                itemFromDb.Name = itemFromUi.Name;

                itemFromDb.NumericTraffic = itemFromUi.NumericTraffic;

                itemFromDb.PercentageTraffic = itemFromUi.PercentageTraffic;

                itemFromDb.Type = itemFromUi.NumericTraffic;

                foreach (var item in itemFromDb.MamConfigurationToBrowser_V1.ToList())
                {
                    if (itemFromUi.MamConfigurationToBrowser_V1.All(b => b.BrowserVersionId != item.BrowserVersionId))
                    {
                        mMaMDBEntities.MamConfigurationToBrowser_V1.DeleteObject(item);
                    }
                }

                for (int i = 0; i < itemFromUi.MamConfigurationToBrowser_V1.Count; i++)
                {
                    var element = itemFromUi.MamConfigurationToBrowser_V1.ElementAt(i);
                    var item = itemFromDb.MamConfigurationToBrowser_V1.SingleOrDefault(b => b.BrowserVersionId == element.BrowserVersionId);
                    if (item != null)
                    {
                        // copy properties from element to item
                    }
                    else
                    {
                        element.Browser = mMaMDBEntities.Browsers.Single(browserItem =>
                            browserItem.BrowserID == element.BrowserID);

                        //element.MamConfiguration_V1 = itemFromDb;

                        //have also tried: element.MamConfiguration_V1 = null;

                        //element.MamConfiguration_V1Reference = null;

                        itemFromDb.MamConfigurationToBrowser_V1.Add(element);
                    }
                }
            }
更新2

我尝试了@AzharKhorasany解决方案,但出现了相同的错误:

for (int i = 0; i < itemFromUi.MamConfigurationToBrowser_V1.Count; i++)
            {
                var element = itemFromUi.MamConfigurationToBrowser_V1.ElementAt(i);
                var item = itemFromDb.MamConfigurationToBrowser_V1.SingleOrDefault(b => b.BrowserVersionId == element.BrowserVersionId);
                if (item != null)
                {
                    // copy properties from element to item
                }
                else
                {
                    element.Browser = mMaMDBEntities.Browsers.Single(browserItem =>
                        browserItem.BrowserID == element.BrowserID);

                    element.MamConfigurationId = itemFromDb.ConfigurationId;

                    //element.MamConfiguration_V1 = itemFromDb;

                    //have also tried: element.MamConfiguration_V1 = null;

                    //element.MamConfiguration_V1Reference = null;
                    //mMaMDBEntities.AddToMamConfigurationToBrowser_V1(itemFromUi.MamConfigurationToBrowser_V1.ElementAt(0)); // add as inserted

                    itemFromDb.MamConfigurationToBrowser_V1.Add(element);
                }
            }
for(int i=0;ib.BrowserVersionId==element.BrowserVersionId);
如果(项!=null)
{
//将属性从元素复制到项
}
其他的
{
element.Browser=mmamdbenties.Browsers.Single(browserItem=>
browserItem.BrowserID==元素.BrowserID);
element.MamConfigurationId=itemFromDb.ConfigurationId;
//element.MamConfiguration_V1=itemFromDb;
//也尝试过:element.MamConfiguration\u V1=null;
//element.MamConfiguration\u V1Reference=null;
//mmamdbenties.addtomConfiguration ToBrowser_V1(itemFromUi.MamConfigurationToBrowser_V1.ElementAt(0));//插入时添加
itemFromDb.MamConfigurationToBrowser_V1.Add(元素);
}
}

您的代码非常冗长,与实际的保存操作没有太多关系,但我想我理解您在做什么。首先,根据错误,您确实定义了新项的ID,它表示数据库中的某些内容,我想这就是您所期望的

当你添加()时,你告诉EF你有新的东西,它告诉你它已经有了。您需要将实体状态从“已添加”更改为“未更改”。在EF中,可以使用以下语法执行此操作:

DbContext.Entry(entity).State = EntityState.Unchanged;
还有其他方法可以做到这一点,所以研究一下。此外,EF有一些帮助程序代码,可以自动将值从一个实例复制到另一个实例。您需要搜索详细信息,但其一般语法是:

DbContext.Entry(entityforUpdate).CurrentValues.SetValues(updatedDetachedEntity)

祝你好运

这解决了我的问题:

   else
            {
                ctidUi.MamConfiguration_V1 = null;

                mMaMDBEntities.MamConfigurationToCTIDs_V1.AddObject(ctidUi);

                itemFromDb.MamConfigurationToCTIDs_V1.Add(ctidUi);
            }

你现在才看到这个链接。但这没用。同样的错误拉德,在问题的顶部说明您使用的是
ObjectContext
而不是
DbContext
,您使用的是哪个版本的EF/.NET(可能是4.0甚至.NET 3.5?),并且您使用的是从
EntityObject
派生的实体,而不是POCO。如果答案涉及
DbContext
(如下所示),您将无法使用许多答案。EF在过去几年中做了一些剧烈的更改,因此版本等非常重要。我忘了,如果该对象实际上已修改,那么请使用EntityState.modified。感谢
DbContext.Entry(entityforUpdate).CurrentValues.SetValues(UpdatedDetailIdentity)
   else
            {
                ctidUi.MamConfiguration_V1 = null;

                mMaMDBEntities.MamConfigurationToCTIDs_V1.AddObject(ctidUi);

                itemFromDb.MamConfigurationToCTIDs_V1.Add(ctidUi);
            }