I am trying to update an existing DBMS object.
I want to add a link (navigation) to it.
I get the entity to update from the database,
and using the same context ( mMamDbEntities )
I am adding a link element.
However, I get a DB error, uniquness restriction violation
{"Violation of the UNIQUE KEY constraint" UQ_MamConfigurations_V1 ". Insert a duplicate key into the 'dbo.MamConfiguration_V1' object. Duplicate key value (elad_14Apr_1315). \ R \ nThe application was terminated." }
How can it be? I thought bidirectional link could be a problem
so I'm even trying to collapse it (see comment)
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);
// {//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); } } }
Update:
mMaMDBEntities.SaveChanges(); throws an exception
These are the DB tables:
CREATE TABLE [dbo].[MamConfiguration_V1]( [ConfigurationId] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NOT NULL, [Description] [nvarchar](200) NOT NULL, [StatusId] [int] NOT NULL, [Type] [int] NOT NULL, [CreatedDate] [datetime2](7) NOT NULL, [UpdatedDate] [datetime2](7) NOT NULL, [PercentageTraffic] [int] NOT NULL, [NumericTraffic] [int] NOT NULL, CONSTRAINT [PK_MamConfigurations_V1] PRIMARY KEY CLUSTERED ( [ConfigurationId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [SECONDARY], CONSTRAINT [UQ_MamConfigurations_V1] UNIQUE NONCLUSTERED ( [Name] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [SECONDARY] ) ON [SECONDARY] GO ALTER TABLE [dbo].[MamConfiguration_V1] WITH CHECK ADD CONSTRAINT [FK_MamConfiguration_V1_ConfigurationType_V1] FOREIGN KEY([StatusId]) REFERENCES [dbo].[MamConfigurationStatuses] ([StatusId]) GO ALTER TABLE [dbo].[MamConfiguration_V1] CHECK CONSTRAINT [FK_MamConfiguration_V1_ConfigurationType_V1] GO ALTER TABLE [dbo].[MamConfiguration_V1] ADD CONSTRAINT [DF_MamConfigurations_V1_CreatedDate] DEFAULT (getdate()) FOR [CreatedDate] GO ALTER TABLE [dbo].[MamConfiguration_V1] ADD CONSTRAINT [DF_MamConfigurations_V1_UpdatedDate] DEFAULT (getdate()) FOR [UpdatedDate] GO CREATE TABLE [dbo].[MamConfigurationToBrowser_V1]( [MamConfigurationId] [int] NOT NULL, [BrowserVersionId] [uniqueidentifier] NOT NULL, [IsWhiteListed] [bit] NOT NULL, [BrowserID] [int] NOT NULL, [VersionNumberLowRange] [varchar](50) NOT NULL, [CreatedDate] [datetime] NOT NULL, [UpdatedDate] [datetime] NOT NULL, [VersionNumberUpperRange] [varchar](50) NULL, CONSTRAINT [PK_MamConfigurationToBrowser_V1_1] PRIMARY KEY CLUSTERED ( [BrowserVersionId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [SECONDARY] ) ON [SECONDARY] GO SET ANSI_PADDING OFF GO ALTER TABLE [dbo].[MamConfigurationToBrowser_V1] WITH CHECK ADD CONSTRAINT [FK_MamConfigurationToBrowser_V1_Browsers] FOREIGN KEY([BrowserID]) REFERENCES [dbo].[Browsers] ([BrowserID]) GO ALTER TABLE [dbo].[MamConfigurationToBrowser_V1] CHECK CONSTRAINT [FK_MamConfigurationToBrowser_V1_Browsers] GO ALTER TABLE [dbo].[MamConfigurationToBrowser_V1] WITH CHECK ADD CONSTRAINT [FK_MamConfigurationToBrowser_V1_BrowserVersion] FOREIGN KEY([MamConfigurationId]) REFERENCES [dbo].[MamConfiguration_V1] ([ConfigurationId]) GO ALTER TABLE [dbo].[MamConfigurationToBrowser_V1] CHECK CONSTRAINT [FK_MamConfigurationToBrowser_V1_BrowserVersion] GO ALTER TABLE [dbo].[MamConfigurationToBrowser_V1] ADD CONSTRAINT [DF_Browser_V1_CreatedDate] DEFAULT (getdate()) FOR [CreatedDate] GO ALTER TABLE [dbo].[MamConfigurationToBrowser_V1] ADD CONSTRAINT [DF_Browser_V1_UpdatedDate] DEFAULT (getdate()) FOR [UpdatedDate] GO
Update 2
I tried @AzharKhorasany's solution, but I will make the same error:
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); } }