10

EF4を使用しています。新しいMyObjectをデータベースに挿入したいと思います。MyObjectには2つのフィールドがあります。

Id:int(Identity)およびName:string

ドキュメントで見たように、Entity Frameworkは、MyObject.IdをSaveChanges()の呼び出し後にデータベースによって生成された値に設定することになっていますが、私の場合はそうなりません。

using (var context = new MyEntities())
{
    var myObject = MyObjects.CreateMyObject(0, "something"); // The first parameter is identity "Id"
    context.MyObjects.AddObject(myObject);
    context.SaveChanges();
    return myObject.Id; // The returned value is 0
}

アップデート:

これは私のエンティティの1つで発生し、他のエンティティは正常に機能します。ちなみに、確認したところ、DB列はIDで、StoreGeneratedPatternはIdentityに設定されています。これがSSDLです。違いはわかりません。最初のものは正しく機能していません:

    <EntityType Name="OrgUnit">
      <Key>
        <PropertyRef Name="Srl" />
      </Key>
      <Property Name="Srl" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
      <Property Name="TypeId" Type="smallint" Nullable="false" />
      <Property Name="Name" Type="varchar" Nullable="false" MaxLength="80" />      
    </EntityType>

    <EntityType Name="OrgType">
      <Key>
        <PropertyRef Name="Srl" />
      </Key>
      <Property Name="Srl" Type="smallint" Nullable="false" StoreGeneratedPattern="Identity" />
      <Property Name="Title" Type="varchar" Nullable="false" MaxLength="120" />
      <Property Name="Options" Type="int" Nullable="false" />
    </EntityType>

更新はデータベースで正常に実行され、IDは生成されますが、エンティティオブジェクトは新しいIDで更新されません。

4

7 に答える 7

11

その場合、EFモデルはおそらく最新ではありません。EFはデータベースから新しいIDを自動的に取得する必要があります。EFモデルを更新してみてください。

ID列のプロパティは、EDMXモデルでは次のようになります。

ここに画像の説明を入力してください

于 2011-06-10T13:10:58.150 に答える
6

私のように、ODP.NETのOracle Entity Framework 4 Providerを使用している場合は、Designerにバグがあります。ドロップダウンボックスでID値を選択するだけでは機能しません。概念モデルの概念プロパティに次のように注釈を付けます

注釈:StoreGeneratedPattern = "Identity"

のように

<Property Type="Int32" Name="Id" Nullable="false" cg:SetterAccess="Private" annotation:StoreGeneratedPattern="Identity" />

ただし、ストレージモデルでも同じことはできません。手動で行う必要があります。対象のEntityTypeでプロパティ(私の場合はID)を見つけ、StoreGeneratedPattern="Identity"を追加します。

    <EntityType Name="PROBLEMI">
      <Key>
        <PropertyRef Name="ID" />
      </Key>
      <Property Name="ID" Type="number" Nullable="false" Precision="10" StoreGeneratedPattern="Identity" />

私はそれを使用しなかったSQLEFプロバイダー'cosの同じバグに気づいていません。

于 2012-11-28T08:36:55.727 に答える
4

これは「うまくいく」はずです。DB列が実際にでIDENTITYあり、StoreGeneratedPatternEDMXでIdentityに設定されていることを確認してください。

于 2011-06-10T13:06:22.267 に答える
2

おお!それは悪夢でしたが、何が問題なのか理解できませんでしたが、ついに解決しました。多分これは同じ問題を抱えている人を助けます。

  1. テーブルとそのデータを作成するためのスクリプトを生成します。
  2. テーブルをドロップします。
  3. スクリプトを実行します。
于 2011-06-11T07:27:18.080 に答える
2

Linq To Entitiesを使用していて、marc_sのアドバイスに従った場合でもこのエラーが発生する場合(これは本当に良いです)、edmx(xmlビュー)でエンティティを直接確認し、次の属性があるかどうかを確認する必要があります。

    <EntityType Name="MyEntity">
      <Key>
        <PropertyRef Name="pk" />
      </Key>
      <Property Name="pk" Type="bigint" Nullable="false" StoreGeneratedPattern="Identity" />
      <Property Name="value" Type="float" Nullable="false" />
    </EntityType>

StoreGeneratedPattern ="Identity"も必要です。

于 2012-05-23T13:31:33.923 に答える
1

変更を保存した後に更新方法を使用してみてください。MSDNに記載されています。

「クライアント上のオブジェクトがデータソース側のロジックによって更新されていることを確認するには、SaveChangesを呼び出した後、StoreWins値を使用してRefreshメソッドを呼び出すことができます。」

http://msdn.microsoft.com/en-us/library/bb336792.aspx

@Craigが提案したこともうまくいくかもしれないと私は感じていますが。

于 2011-06-10T13:07:05.557 に答える
1

私は今日これに遭遇しました。違いは、上記の人が指定していない挿入関数を使用していたことです。私がしなければならなかったのは、挿入関数のストアドプロシージャがSCOPE_IDENTITY()を返し、返されたIDの結果バインディングを使用することでした。

私の問題を修正しました。

于 2012-06-05T22:40:24.340 に答える