C # 4.0 / EF - сгенерированные сервером ключи и сгенерированные сервером значения не поддерживаются SQL Server Compact - PullRequest
4 голосов
/ 29 апреля 2010

Я только что переместил один из своих проектов в 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 точно. Похоже, нужно создать идеальный маленький инструмент / надстройку ...

1 Ответ

3 голосов
/ 29 апреля 2010

Важно проверить файл EDMX и убедиться, что в этом свойстве / столбце нет идентификатора StoreGeneratedPattern, содержащего идентификатор.

...