2012-02-13 3 views
1

Я полный n00b в структуре Entity. Установили Postgresql и Npgsql. Просто хотел начать с простого теста БД, но у меня проблемы уже со столбцом идентификатора таблицы.Entity Framework с использованием Postgresql и Npgsql

Я начинаю с создания простой таблицы Score и ее ограничений PK вручную в postgres (sql ниже). Я запускаю edmgen2.exe с параметром/retrofitmodel. В списке я проверяю только включение таблицы оценки, а edmgen2.exe выводит 4 файла. Я копирую файлы в каталог проекта VS2010, а также добавляю edmx к проекту. Когда я открываю свою диаграмму, ScoreID помечен символом Key. Я пишу код для вставки простого объекта. Он работает в первый раз выполняется, но в следующий раз я получаю:

{ «ОШИБКА: 23505: дублирование ключа нарушает ограничение уникальности \» Score_PK \ «»}

Я смотрю в базе данных, и один элемент имеет ScoreID 0. Мне кажется, что по какой-то причине EF пытается создать еще один объект с ID 0 вместо увеличения значения ID. Это заставляет меня орех, потому что это всего лишь глупый простой тест, прежде чем я начну с реальной модели db.

Я попытался:

  • Изменение StoreGeneratedPattern атрибута из None Удостоверение на диаграмме, а также вычисленным.

  • Инъекционный эти значения также в файл SSDL для ScoreID атрибут

Я приложил некоторые из пораженной коды ниже. Пожалуйста, помогите мне!

ТАБЛИЦА СОЗДАНИЯ:

CREATE TABLE "Score" 
(
    "ScoreID" integer NOT NULL, 
    "ScorePoint" integer, 
    CONSTRAINT "Score_PK" PRIMARY KEY ("ScoreID") 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE "Score" 
    OWNER TO postgres; 

СОХРАНИТЬ МЕТОД:

  using (BoringDBContext dbContext = new BoringDBContext()) 
      { 
       Score aScore = new Score(); 
       aScore.ScorePoint = 9; 
       dbContext.AddToScore(aScore); 
       dbContext.SaveChanges(); 
      } 

SSDL ФАЙЛ (удален <>):

?xml version="1.0" encoding="utf-8"? 
Schema Namespace="BoringDB.store" Alias="Self" Provider="Npgsql" ProviderManifestToken="9.1.2" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl"> 
    <EntityContainer Name="BoringDBstoreContainer"> 
    <EntitySet Name="Score" EntityType="BoringDB.store.Score" store:Type="Tables" Schema="public"/
    /EntityContainer> 
    EntityType Name="Score" 
    Key 
     PropertyRef Name="ScoreID" 
    /Key 
    Property Name="ScoreID" Type="int4" Nullable="false" StoreGeneratedPattern="Identity" 
    Propert Name="ScorePoint" Type="int4" 
    /EntityType 
/Schema 

ЧАСТЬ EDMX ФАЙЛ (удален <>):

edmx:ConceptualModels 
    Schema Namespace="BoringDB" Alias="Self" xmlns="http://schemas.microsoft.com/ado/2008/09/edm" 
    EntityContainer Name="BoringDBContext" 
     EntitySet Name="Score" EntityType="BoringDB.Score"/
    /EntityContainer 
    EntityType Name="Score" 
     Key 
     PropertyRef Name="ScoreID"/
     /Key 
     Property Name="ScoreID" Type="Int32" Nullable="false" a:StoreGeneratedPattern="Identity" xmlns:a="http://schemas.microsoft.com/ado/2009/02/edm/annotation"/
     Property Name="ScorePoint" Type="Int32" Nullable="true"/
    /EntityType 
    /Schema 
/edmx:ConceptualModels 

ответ

3

Я нашел короткий ответ на мой длинный вопрос. Изменение типа данных ScoreID в BIGSERIAL вместо целого в базе данных привело к работе автоматического увеличения. Вручную создавая последовательность и устанавливая ее как значение по умолчанию, никогда не было, не знаю, почему.

+0

звучит так, как будто вы сбросили свою последовательность после того, как данные уже были в результате ошибки повторяющегося ключа. – markmnl

+1

Нет, проблема в том, что он не перезагружается, проблема в том, что столбец должен иметь последовательность для работы с EF. – VoidMain