2012-08-09 30 views
29
foreach (var item in order.MyFiles) 
{ 
    var newFile = adapter.db.File.CreateObject(); 

    newFile.Name = item.FileName; 

    adapter.db.File.AddObject(newFile); 

    adapter.db.SaveChanges(); 

    item.MyFile.Add(new MyFile { FileID = newFile.FileID }); 

    adapter.db.SaveChanges(); 
} 

foreach (var item in tempFilesList) 
{ 
    adapter.db.DeleteObject(item); 
} 

adapter.db.SaveChanges(); 

Đó là mã bản sao các hàng trong bảng MyFile, ví dụ như nếu lặp loop 3 lần tôi thấy 6 hàng (3 x 2 * adapter.db.SaveChanges() ???)C# Không thể xác định vào cuối chủ yếu của mối quan hệ

Nhưng, nếu tôi chỉ có một số adapter.db.SaveChanges(); (cái cuối cùng) tôi nhận được lỗi

Không thể xác định kết thúc chính của mối quan hệ 'my_dbModel.FK_MyFile_File'. Nhiều thực thể được thêm có thể có cùng một khóa chính.

Tôi cho rằng nguyên nhân là trong trường hợp đó nó không cam kết các mặt hàng adapter.db.File.AddObject(newFile); trước khi đưa chúng vào item.MyFile.Add(new MyFile { FileID = newFile.FileID }); Nhưng tôi có thể sai, bất kỳ ý tưởng nào để khắc phục?

Trả lời

45

Bạn không thể sử dụng newFile.FileID khi xác định MyFile mới trước khi lưu thay đổi. FileID là mặc định (0) cho đến khi bạn lưu thực thể mới trong cơ sở dữ liệu. Bạn sẽ phải sử dụng thuộc tính điều hướng của File trong lớp MyFile của mình. EF sẽ phát hiện mối quan hệ và sẽ cam kết dữ liệu một cách thích hợp.

Cố gắng thay đổi dòng item.MyFile.Add(new MyFile { FileID = newFile.FileID }); với:

item.MyFile.Add(new MyFile { File = newFile }); 

nơi File là tài sản chuyển hướng quy định tại MyFile thực thể.

+2

Bạn đã lưu lại đêm của mình, cảm ơn nhiều :) – Tony

+0

Giải quyết được sự cố của tôi! – HuckIt

3

Điều này có thể là do tham chiếu tuần hoàn trong bạn EDMX trở lại cùng một bảng.

Có nghĩa là nếu EmployeeDepartment là bảng mà bạn sẽ cập nhật và khóa chính là EmployeeDepartmentID và nếu đó là cột nhận dạng và được tạo tự động, hãy kiểm tra EDMX xem EmployeeDepartmentID có được tham chiếu lại chính nó hay không. Nếu vậy, hãy nhấp chuột phải vào tham chiếu chính đó và nhấp vào xóa.

Điều này phù hợp với tôi và tôi hy vọng điều này cũng phù hợp với bạn.

Xin cảm ơn,

Bibin.

+0

Vì vậy, bạn nói DONT bao gồm tham chiếu tự? –

Các vấn đề liên quan