1

私は Entity フレームワークで完全に n00b です。Postgresql と Npgsql をインストールしました。DB の簡単なテストから始めたかっただけですが、テーブルの ID 列で既に問題が発生しています。

単純なテーブル Score とその PK 制約を postgres で手動で作成することから始めます (以下の sql)。パラメータ /retrofitmodel を指定して edmgen2.exe を実行します。リストでは、スコアテーブルを含めることのみを確認し、edmgen2.exe は 4 つのファイルを出力します。ファイルを VS2010 プロジェクト ディレクトリにコピーし、edmx もプロジェクトに含めます。ダイアグラムを開くと、ScoreID にキー記号が付いています。単純なオブジェクトを挿入するコードを書きます。初めて実行したときは機能しますが、次回は次のようになります。

{"エラー: 23505: 重複するキー値が一意の制約 \"Score_PK\" に違反しています"}

データベースを調べたところ、そこにある 1 つのアイテムのスコア ID は 0 でした。何らかの理由で、EF が ID 値をインクリメントするのではなく、ID 0 で別のオブジェクトを作成しようとしているようです。これは、実際の db モデルを使い始める前のばかげた単純なテストにすぎないため、気が狂いそうになります。

私が試してみました:

  • 図の StoreGeneratedPattern 属性を None から Identity に、さらに Computed に変更します。

  • これらの値を ScoreID 属性の ssdl ファイルにも挿入する

関連するコードの一部を以下に添付しました。私を助けてください!!

テーブルの作成:

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
4

1 に答える 1

3

長い質問に対する短い答えを見つけました。データベースでScoreIDデータ型を整数ではなくBIGSERIALに変更すると、自動インクリメントが機能しました。シーケンスを手動で作成し、デフォルト値として設定することはありませんでした.理由はわかりません.

于 2012-02-15T18:12:34.667 に答える