Сначала код Entity Framework - Не удается вставить дубликат ключа в объект 'dbo.T_CRProviders'
-
12-12-2019 - |
Вопрос
У меня есть кое-какая срочная проблема, на которую я не смог найти ответа в Интернете.
Я использую CodeFirst EF 4.3.1 и получаю сообщение об ошибке:Violation of PRIMARY KEY constraint 'PK_T_CRProviders'. Cannot insert duplicate key in object 'dbo.T_CRProviders'.
Мой код таков:
Модели:
public enum CRProviderEnums
{
PE_Abcd = 0,
PE_Efgh
}
[Table("T_CRProviders")]
public class CRProvider
{
[Key]
[Required]
public int Enum { get; set; }
[Required]
public string Name { get; set; }
}
[Table("T_CRSupportedResources")]
public class CRSupportedResource
{
[Key]
public Guid SupportedResourceId { get; set; }
[Required]
public CRProvider Provider { get; set; }
}
DbContext:
public class RSContext : DbContext
{
public DbSet<CRProvider> CRProviders { get; set; }
public DbSet<CRSupportedResource> CRSupportedResources { get; set; }
}
Таблица T_CRProviders выглядит следующим образом: Enum (PK), Name
Таблица T_CRSupportedResources выглядит следующим образом: SupportedResourceId (PK), Provider_Enum (FK).
В таблице базы данных T_CRProviders у меня уже есть поставщик со следующими значениями:
Enum: 0 (which is PE_Abcd)
Name: "PE_Abcd"
Теперь моя функция main() вызывает метод AddSupportedResource.Этот метод добавляет в таблицу T_CRSupportedResources новый CRSupportedResource, который ссылается на поставщика 0 (PE_Abcd).Метод выглядит следующим образом:
public void AddSupportedResource()
{
CRSupportedResource supportedResource = new CRSupportedResource()
{
SupportedResourceId = Guid.NewGuid(),
Provider = new CRProvider()
{
Enum = (int)CRProviderEnums.PE_Abcd,
Name = "PE_Abcd"
}
};
using (RSContext myContext = new RSContext())
{
myContext.CRSupportedResources.Add(supportedResource);
myContext.SaveChanges();
}
}
Я ожидаю, что этот метод оставит таблицу T_CRProviders нетронутой и добавит новую строку в таблицу T_CRSupportedResources, которая будет выглядеть следующим образом:
SupportedResourceId: DE532083-68CF-484A-8D2B-606BC238AB61
Provider_Enum (FK): 0 (which is PE_Abcd).
Вместо этого при сохранении изменений Entity framework также пытается добавить поставщика в таблицу T_CRProviders, и поскольку такой поставщик уже существует, он выдает следующее исключение:
An error occurred while updating the entries.
Violation of PRIMARY KEY constraint 'PK_T_CRProviders'. Cannot insert duplicate key in object 'dbo.T_CRProviders'.
The statement has been terminated.
Мой вопрос:
Как я могу проинструктировать EF не обновлять таблицу T_CRProviders
при обновлении таблицы T_CRSupportedResources
?
Кстати, на SQL-сервере я вижу эту таблицу T_CRSupportedResources
имеет внешний ключ с именем FK_RW_TCRSupportedCloudResources_RW_TCRCloudProviders_Provider_Enum
и его правило обновления имеет значение No Action
.
Решение 2
На самом деле, есть способ сделать это.
Смотрите ответ на мой вопрос по следующей ссылке:
Другие советы
Я ожидаю, что этот метод оставит таблицу T_CRProviders нетронутой и добавит новую строку в таблицу T_CRSupportedResources
Нет, этого не произойдет.Вы создаете отдельный граф сущностей, состоящий из существующей сущности a и новой сущности.EF не знает о существовании вашей сущности, пока вы не сообщите ему об этом - нет запросов к базе данных, подтверждающих существование, выполняемых EF on behind.
Если ты позвонишь Add
метод все объекты в вашем графе сущностей добавляются как новые.Если вы не хотите вставлять их все, вы можете начать с использования Attach
и вручную измените состояние на новое.Например, как:
myContext.CRSupportedResources.Attach(supportedResource);
myContext.Entry(supportedResource).State = EntityState.Added;