Я использую Entity Framework Core для хранения графа объектов в базе данных.В разное время, пока я строю график, я создаю сущность, сохраняю ее в базе данных и высвобождаю контекст.Однако я сталкиваюсь с проблемой, когда EFC пытается вставить объект, который уже был вставлен, когда он подключен к новому объекту.Это лучше всего объяснить с помощью кода.Вот небольшой фрагмент кода (это прямой код, но два использования контекстов происходят в разное время и в разных местах кода).
Во втором вызове context.SaveChanges()
я получаю следующееисключение:
SqlException:
Невозможно вставить явное значение для столбца идентификаторов в таблице 'Пространство имен', когда для IDENTITY_INSERT установлено значение OFF.
Когда я смотрюво время выполнения SQL он пытается снова вставить сущность пространства имен, возможно потому, что myType сохраняется в БД и имеет ссылку на сущность dbNamespace
.
// see if namespace is in the db and add it if not
string someNamespaceString = "foobar";
CodeDatabase.Models.Namespace dbNamespace;
using (var context = new CodeFactsContext())
{
dbNamespace = context.Namespace.FirstOrDefault(ns => ns.Namespace1 == someNamespaceString);
if (dbNamespace == null)
{
dbNamespace = new Namespace() { Namespace1 = someNamespaceString };
context.Namespace.Add(dbNamespace);
}
context.SaveChanges();
}
// Type entity created somewhere from the code
var myType = new CodeDatabase.Models.Type()
{
FullName = "foobar.mytype",
ShortName = "mytype",
Namespace = dbNamespace // this is already in the DB
};
// check if myType is in the db and add it if not
using (var context = new CodeFactsContext())
{
var dbType = context.Type.FirstOrDefault(t => t.FullName == myType.FullName);
if (dbType == null)
{
dbType = myType;
context.Add(dbType);
}
context.SaveChanges(); // throws exception
}
Любая идея, какзаставить EF Core распознать (во втором context.SaveChanges()
), что myType
должен быть вставлен в базу данных, а myType.Namespace
не должен, потому что он уже там?Обе сущности имеют внутренний идентификатор, который автоматически генерируется БД, а идентификатор пространства имен устанавливается равным значению базы данных после первого вызова SaveChanges
.Я думал, что EF Core распознает, что идентификатор не равен 0, и не попытается его сохранить.Любая помощь / предложения очень приветствуются.