2011-10-20 18 views
1

異なるIDを持つデータベースにデータをインポートするときに、IDが再度作成される問題が発生しています。すべてのデータが正しくインポートされます。つまり、ID(ID列)はインポートされる必要があります。IDを一時的にオフにする - Entity Framework 4.1コード先頭

このモデルには2つのキーがあります。 IDとアイデンティティアイデンティティは、基本的に、他のデータソースからのユニークなインスタンス名です。したがって、これはユニークな組み合わせを作成します。

これは、すべてのクラスDbContextからであるDatabaseContext上OnModelCreatingを経由して設定されている:

 modelBuilder.Entity<Observation>().HasKey(m => new {m.Instance, m.Id}); 
     modelBuilder.Entity<Observation>().Property(m => m.Id).HasDatabaseGeneratedOption(
      DatabaseGeneratedOption.Identity); 

クラスは次のようになります。

public class Observation 
{ 
    public string Instance { get; set; } 
    public int Id { get; set; } 
    ... 
} 

データベースコンテキストのみ、このASPに一度作成されます.Net MVC 3 Ninjectを使用したアプリケーション。

私は新しいエントリを追加しながらオフアイデンティティを設定するには、SQLコマンドを使用してみましたが、成功しません:

public void SetIdentiyObservation(bool isOn) 
    { 
     var state = isOn ? "ON" : "OFF"; 
     _context.Database.SqlQuery<Observation>("SET IDENTITY_INSERT Observation @state", new SqlParameter("state", state)); 
    } 

作成されたテーブル構造がMSSQLに次のようになります。

CREATE TABLE [dbo].[Observations](
[Instance] [nvarchar](128) NOT NULL, 
[Id] [int] IDENTITY(1,1) NOT NULL, 
    ... 
PRIMARY KEY CLUSTERED 
(
[Instance] ASC, 
[Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

どれでもこれについてのヘルプは高く評価されています:)

答えて

0

入力のおかげで本当にありがとう、私はこれを基本に戻って、データベースのニーズから顧客のニーズを取り除くことでこれを解決しました。 instance + idの顧客の要件を格納する列に終わり、内部IDを使用してデータベースを構築することができます:)

0

SqlQuery<T>IEnumerableを返し、列挙するまでSQLクエリは実行されません。ステートメントの末尾に.ToList()を追加すると、構文が正しくないという例外が表示されます。 EFが結果をObservationにマップしようとすると、問題が発生します。

私は最終的に、これは、以下のものを使用して実行するために取得することができた:私は解決できませんでした最後の問題につながった

_context.Database.SqlQuery<object>("SET IDENTITY_INSERT Observation " + (isOn ? "ON" : "OFF")).ToList(); 

Idはデータベースによって生成されたとマークされているため、EFはその値をINSERTステートメントに含めません。

実行時にの値をIdに変更する方法が見つかった場合は、コンテキストを使用してエンティティを追加できます。残念ながら、私はこれを行う方法がわかりません、指定されたIdの行を挿入する唯一の方法は、基になる接続を使用し、必要なSQLを実行することでした。

関連する問題