2017-12-15 12 views
0

데이터베이스의 첫 번째 방법을 사용하고 있습니다.다른 테이블의 값 (정확하게 같음)을 추가하려고 할 때 DBContext를 사용하여 ID 삽입을 설정하는 방법

내 목적지 테이블을 사용하여 제 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

닷넷 버전 : 4.5 엔티티 프레임 워크 : 튜토리얼에서 6.1.3

+0

오류는 무엇입니까? –

+0

문제를 올바르게 기재하십시오. –

+0

'그것은 나를 위해 작동하지 않습니다'어떻게? 어떤 오류가 발생하고 있습니까? –

답변

1

당신이 연결, 저자 상태 :

모든 강제로 삽입 할 기본 키를 [DatabaseGenerated(DatabaseGeneratedOption.None)]으로 변경해야합니다. 이렇게하면 EF가 시도하지 않고 값을 설정하고 나머지 데이터와 함께 값을 삽입하기 만하면됩니다.

편집 :

내가이 설정을 시도하고 일했다 : (. 감사합니다 거트 아놀드는)

항목 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 IDENTITY_INSERT 설정" 그게 해결책 이었다면 ... 내 대답을 편집 할 것입니다 –