2017-12-15 7 views
0

私は、データベースの最初のアプローチを使用しています。(正確に同じことになって)別のテーブルから

マイ先テーブルは、第RemoveRange()を使用して切り捨てられ、その後、データは他のすべてのカラムのデータが正しくコピーされDestination.Tables.AddRange(Source.Tables);

を使用してソース・テーブルから転送されます。しかし、「Id」フィールドは大きな番号から入力されます。私はIdフィールドを同じにしたい。だからこそ、アイデンティティの挿入を設定しようとしているのです。

私はこのチュートリアルに従うことを試みたが、関数内 http://blog.robertobonini.com/2014/10/09/entity-framework-with-identity-insert/

table.cs

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required)) 
      { 
       using (var Destination = new DestinationEntities(NewconnDestination)) 
       { 
        using (var Source = new SourceEntities(NewconnSource)) 
        { 

         Source.Configuration.LazyLoadingEnabled = false; 
         Source.Configuration.ProxyCreationEnabled = false; 
         Destination.Database.ExecuteSqlCommand(@"SET IDENTITY_INSERT dbo.[Table] ON"); 
         Destination.Tables.AddRange(Source.Tables); 
         SaveChanges(Destination); 
         Destination.Database.ExecuteSqlCommand(@"SET IDENTITY_INSERT dbo.[Table] OFF"); 
         scope.Complete(); 
        } 
       } } 

これらは私のしている私のために動作しません。テーブルの列プロパティ Id properties

何か他のもの必要がありますか?またはこれを達成するための他の方法?

これは問題です。両方のテーブルで同じID列が必要です。 ソース表 ID column 宛先表 ID column

.NETバージョン:4.5エンティティフレームワーク:チュートリアル6.1.3

+0

エラーは何が起こったのか? –

+0

問題を適切に記述してください。 –

+0

'それは私にとってはうまくいかないのですか? 'あなたはどんなエラーを出していますか? –

答えて

1

あなたがリンクされ、著者の状態:

すべて強制的に挿入する主キーを[DatabaseGenerated(DatabaseGeneratedOption.None)]に変更する必要があります。これにより、EFが試行しないようにし、チャ値を入力して残りのデータを挿入するだけです。

EDIT:

私は、このセットアップを試し、それが働いた:(。ゲルトアーノルドのおかげで)

アイテムIDは、テーブルItemTableのID列です。

[Table("ItemTable")] 
public partial class ItemTable 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int ItemID { get; set; } 

    [StringLength(50)] 
    public string ItemName { get; set; } 
} 

static void Main(string[] args) 
    { 
     List<ItemTable> ItemsList = new List<ItemTable> 
     { 
      new ItemTable { ItemID=1, ItemName="one" }, 
      new ItemTable { ItemID=2, ItemName="two" }, 
      new ItemTable { ItemID=3, ItemName="three" } 
     }; 

     TestDbContext testDbContext = new TestDbContext(); 

     try 
     { 
      testDbContext.Database.Connection.Open(); 
      testDbContext.Database.ExecuteSqlCommand(@"SET IDENTITY_INSERT [TestDB].[dbo].[ItemTable] ON"); 
      testDbContext.ItemTables.AddRange(ItemsList); 
      testDbContext.SaveChanges(); 
     } 
     finally 
     { 
      testDbContext.Database.Connection.Close(); 
     } 
    } 
+0

データベースにID列があるため、助けになりません。 –

+0

[DatabaseGenerated(DatabaseGeneratedOption.None)]を使用しましたが、それは役に立ちません。 – Nivedita

+0

もし私がGerd Arnoldsの答えを別の質問から読んで理解していれば、彼は正しくリンクしています... 接続を手動で開いて閉じる必要があります: Destination.Database.Connection.Open と Destination.Database.Connection.Close() あなたDbContextを開閉するので、ちょうどそのコマンドのため、次のコマンドSET_IDENTITYの接続は私に知らせて OFFにリセットされ、無用であるそうでない場合は、あなたの「ON SET IDENTITY_INSERT」それが解決策だったら...もしそうなら、私は自分の答えを編集します –

関連する問題