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:
- Tạo bảng cơ sở dữ liệu với cột sắc.
- Trong Visual Studio, hãy thêm một EDMX mới.
- 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)
- 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.
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ô. –