2012-03-08 25 views
9

Tôi đang sử dụng Entity Framework 4.0 với C# .NET. Tôi cố gắng để tạo ra một công cụ di cư "đơn giản" để chuyển đổi dữ liệu từ một bảng khác (bảng không giống nhau)Khuôn khổ thực thể: Sự cố với IDENTITY_INSERT - "Không thể chèn giá trị rõ ràng cho cột nhận dạng trong bảng"

Cơ sở dữ liệu là một SQL Server 2005.

Tôi có một cấu trúc mục tiêu DB tương tự như sau:

MYID - int, primary key, identity specification (yes) 
MYData - varchar(50) 

Trong chương trình di chuyển của mình, tôi nhập cấu trúc DB vào edmx. Sau đó tôi tắt thủ công StoreGeneratedPattern.

Trong chương trình nhập cư của tôi, tôi tắt cột sắc như sau (tôi đã xác minh nó thực sự tắt nó đi):

  using (newDB myDB = new newDB()) 
      { 
       //turn off the identity column 
       myDB.ExecuteStoreCommand("SET IDENTITY_INSERT SR_Info ON"); 
      } 

Sau khi mã trên, tôi có đoạn mã sau:

  using (newDB myDB = new newDB()) 
      { 
       DB_Record myNewRecord = new DB_Record(); 
       //{do a bunch of processing} 
       myNewRecord.MYID = 50; 
       myDB.AddToNewTable(myNewRecord); 
       myDB.SaveChanges(); 
      } 

Khi nó đến myDB.SaveChanges(), nó tạo ra một ngoại lệ: "Không thể chèn giá trị rõ ràng cho cột nhận dạng trong bảng".

Tôi biết mã hoạt động tốt khi tôi goto bảng SQL Server theo cách thủ công và tắt Đặc tả danh tính.

Tùy chọn của tôi là phải có công cụ di chuyển xử lý bật và tắt Thông số nhận dạng thay vì phải thực hiện thủ công trên cơ sở dữ liệu. Công cụ di chuyển này sẽ được sử dụng trên cơ sở dữ liệu sandbox, cơ sở dữ liệu dev, cơ sở dữ liệu QA, và sau đó một cơ sở dữ liệu sản xuất hoàn toàn tự động sẽ tốt đẹp.

Bất kỳ ý tưởng nào để việc này hoạt động đúng không?

tôi đã sử dụng các bước sau:

  1. Tạo bảng cơ sở dữ liệu với cột sắc.
  2. Trong Visual Studio, hãy thêm một EDMX mới.
  3. Trên EDMX, tôi chọn Cập nhật mô hình từ cơ sở dữ liệu (và chọn thêm bảng mong muốn)
  4. Trên EDMX, tôi bấm MYID và trong ngăn thuộc tính, tôi đặt StoreGeneratedProcedure thành None.

Tại thời điểm này, khi tôi thêm bản ghi mới với MYID, DB ghi đè giá trị MYID bằng giá trị Nhận dạng.

Cho đến giờ, bất kể tôi đã thêm "myDB.ExecuteStoreCommand (" SET IDENTITY_INSERT SR_Info ON ");", nó cũng giống như vậy.

Tôi đã thử thêm quy trình được lưu trữ và nó cũng không hoạt động.

Tôi nghi ngờ rằng cuối cùng, quá trình di chuyển sẽ không được hoàn toàn tự động.

+0

EF không chơi tốt với cột Identity cho mục đích di cư. Chúng tôi rời EF và sử dụng thư viện Sql Client cơ bản với Sql Command để thực hiện di chuyển. Hoặc bạn có thể sử dụng siêu dữ liệu để Tạo và thực thi SQL thô. –

Trả lời

0

này sẽ hứa hẹn Using IDENTITY_INSERT with EF4

Bạn về cơ bản cần phải chắc chắn mô hình dữ liệu của bạn biết về những thay đổi bạn thực hiện cho các cơ sở dữ liệu, như bây giờ họ không còn đồng bộ với bảng bên dưới.

Tuy nhiên, tôi không khuyên bạn nên sử dụng EF làm công cụ tải dữ liệu trọng lượng nặng. Ưu tiên công cụ SQL hoặc ETL.

+0

Simon, tôi chỉ di chuyển tổng cộng 30-40k giá trị của các bản ghi ... Tôi đã hy vọng sẽ làm một công cụ di chuyển bẩn nhanh chóng trong EF kể từ khi tôi là một chút gỉ trên "nguyên" SQL. LOL. Tôi đã xem bài viết trên trước khi hỏi câu hỏi này. –

7

Khi cột là bản sắc, chèn bản ghi từ Entity Framework sẽ nâng cao được lỗi sau:

Cannot insert explicit value for identity column in table 'MY_ENTITY' when IDENTITY_INSERT is set to OFF. To avoid error set entity property StoreGeneratedPattern="Identity"

<EntityType Name="MY_ENTITY"> 
    <Key> 
     <PropertyRef Name="UserID" /> 
    </Key> 
    <Property Name="RecordID" Type="int" StoreGeneratedPattern="Identity" Nullable="false" /> 
</EntityType> 
+0

Địa phương hóa tệp này ở đâu? – Danilo

0
protected override void OnModelCreating(DbModelBuilder modelBuilder)  
{ 
    modelBuilder.Entity<EntityClass>().HasKey(p => p.Id); 

    modelBuilder.Entity<EntityClass>() 
     .Property(c => c.Id) 
     .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

    base.OnModelCreating(modelBuilder); 
} 
Các vấn đề liên quan