Entity Framework с использованием Postgresql и Npgsql - PullRequest
1 голос
/ 13 февраля 2012

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

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

{"ОШИБКА: 23505: повторяющееся значение ключа нарушает уникальное ограничение \" Score_PK \ ""}

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

Я пытался:

  • Изменение атрибута StoreGeneratedPattern с None наИдентификационные данные на диаграмме, а также для Computed.

  • Добавление этих значений также в файл 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

1 Ответ

3 голосов
/ 15 февраля 2012

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

...