Я использую Entity Framework 6 DB Сначала с таблицами SQL Server каждый имеет первичный ключ uniqueidentifier
. Таблицы имеют значение по умолчанию в столбце первичного ключа, который устанавливает его в newid()
. Поэтому я обновил мой .edmx, чтобы установить StoreGeneratedPattern
для этих столбцов на Identity
. Поэтому я могу создавать новые записи, добавлять их в контекст базы данных, а идентификаторы создаются автоматически. Но теперь мне нужно сохранить новую запись с определенным идентификатором. Я прочитал в этой статье, в котором говорится, что вы должны выполнить SET IDENTITY_INSERT dbo.[TableName] ON
перед сохранением при использовании столбца идентификатора int identity. Так как мои - это Guid, а не фактический столбец идентичности, который по существу уже сделан. Тем не менее, хотя в моем С# я устанавливаю идентификатор в правильный Guid, это значение даже не передается как параметр сгенерированной вставки SQL, а новый идентификатор генерируется SQL Server для первичного ключа.
Мне нужно иметь возможность:
- вставьте новую запись и пусть идентификатор будет автоматически создан для нее,
- вставьте новую запись с указанным идентификатором.
У меня есть # 1. Как я могу вставить новую запись с определенным первичным ключом?
Edit:
Сохранить выдержку кода (Note accountMemberSpec.ID - это конкретное значение Guid, которое я хочу быть основным ключом AccountMember):
IDbContextScopeFactory dbContextFactory = new DbContextScopeFactory();
using (var dbContextScope = dbContextFactory.Create())
{
//Save the Account
dbAccountMember = CRMEntity<AccountMember>.GetOrCreate(accountMemberSpec.ID);
dbAccountMember.fk_AccountID = accountMemberSpec.AccountID;
dbAccountMember.fk_PersonID = accountMemberSpec.PersonID;
dbContextScope.SaveChanges();
}
-
public class CRMEntity<T> where T : CrmEntityBase, IGuid
{
public static T GetOrCreate(Guid id)
{
T entity;
CRMEntityAccess<T> entities = new CRMEntityAccess<T>();
//Get or create the address
entity = (id == Guid.Empty) ? null : entities.GetSingle(id, null);
if (entity == null)
{
entity = Activator.CreateInstance<T>();
entity.ID = id;
entity = new CRMEntityAccess<T>().AddNew(entity);
}
return entity;
}
}
-
public class CRMEntityAccess<T> where T : class, ICrmEntity, IGuid
{
public virtual T AddNew(T newEntity)
{
return DBContext.Set<T>().Add(newEntity);
}
}
И вот для этого зарегистрированный SQL-код:
DECLARE @generated_keys table([pk_AccountMemberID] uniqueidentifier)
INSERT[dbo].[AccountMembers]
([fk_PersonID], [fk_AccountID], [fk_FacilityID])
OUTPUT inserted.[pk_AccountMemberID] INTO @generated_keys
VALUES(@0, @1, @2)
SELECT t.[pk_AccountMemberID], t.[CreatedDate], t.[LastModifiedDate]
FROM @generated_keys AS g JOIN [dbo].[AccountMembers] AS t ON g.[pk_AccountMemberID] = t.[pk_AccountMemberID]
WHERE @@ROWCOUNT > 0
-- @0: '731e680c-1fd6-42d7-9fb3-ff5d36ab80d0' (Type = Guid)
-- @1: 'f6626a39-5de0-48e2-a82a-3cc31c59d4b9' (Type = Guid)
-- @2: '127527c0-42a6-40ee-aebd-88355f7ffa05' (Type = Guid)