Я только что переместил один из своих проектов в VS2010 / fx4.0 и использую базу данных SQL CE в качестве резервного хранилища. После перехода на эту версию .NET я получаю эту ошибку:
Сгенерированные сервером ключи и сгенерированные сервером значения не поддерживаются SQL Server Compact.
Моя таблица была , определенная с помощью PK UserName (строка) и DoorOpen (datetime) как SQLCE обязательно в каждой таблице в fx3 есть PK 0,5. Теперь, когда я в fx4.0, я в тупике. Я гуглил по этому поводу, и каждый ответ, который я нашел, был:
SQLCE не поддерживает автоматическую генерацию значений (которые мне, безусловно, не нужны), поэтому добавьте туда идентификатор GUID и заполните его из кода.
Я попробовал этот подход, и я все еще получаю ту же ошибку!
SQLCE:
CREATE TABLE [ImportDoorAccesses] (
[RawData] nvarchar(100) NOT NULL,
[DoorOpen] datetime NOT NULL,
[UserName] nvarchar(100) NOT NULL,
[CardNumber] bigint NOT NULL,
[Door] nvarchar(4000) NOT NULL,
[Imported] datetime NOT NULL,
[ID] uniqueidentifier NOT NULL -- new column
);
ALTER TABLE [ImportDoorAccesses]
ADD CONSTRAINT [PK_ImportDoorAccesses]
PRIMARY KEY ([ID] );
В качестве ограничения использовалось:
ALTER TABLE [ImportDoorAccesses]
ADD CONSTRAINT [PK_ImportDoorAccesses]
PRIMARY KEY ([DoorOpen],[UserName]);
КОД:
foreach (dto.DoorAudit newDoorAudit in dataTransferObject)
{
if (newDoorAudit.DoInsert)
{
myEntities.AddToImportDoorAccesses(new ImportDoorAccess
{
CardNumber = newDoorAudit.CardNumber,
Door = newDoorAudit.Door,
DoorOpen = newDoorAudit.DoorOpen,
Imported = newDoorAudit.Imported,
RawData = newDoorAudit.RawData,
UserName = newDoorAudit.UserName,
ID = Guid.NewGuid() // LOOK - HERE IT IS AS SUGGESTED!
});
}
}
myEntities.SaveChanges();
Так что теперь? Это ошибка в EF4? Я что-то не так делаю?
ТИА
Примечание:
Просматривая файл EDMX (щелкните правой кнопкой мыши, откройте с помощью XML), я обнаружил, что один из моих столбцов даты был установлен с StoreGeneratedPattern = "Identity" .
<EntityType Name="ImportDoorAccesses">
<Key>
<PropertyRef Name="ID" />
</Key>
<Property Name="RawData" Type="nvarchar" Nullable="false" MaxLength="100" />
<Property Name="DoorOpen" Type="datetime" Nullable="false" />
<Property Name="UserName" Type="nvarchar" Nullable="false" MaxLength="100" />
<Property Name="CardNumber" Type="bigint" Nullable="false" />
<Property Name="Door" Type="nvarchar" Nullable="false" />
<Property Name="Imported" Type="datetime" StoreGeneratedPattern="Identity" Nullable="false" />
<Property Name="ID" Type="uniqueidentifier" Nullable="false" />
</EntityType>
Затем я переключился обратно на красивый вид модели и щелкнул по каждому столбцу в моей базе данных, чтобы убедиться, что он установлен НЕ . PITA точно. Похоже, нужно создать идеальный маленький инструмент / надстройку ...