Tôi chỉ có thể trả lời phần thứ hai của câu hỏi của bạn: "Ngoài ra ... tại sao không có một ObjectSet cho" Funds "trong DataContext của tôi (nghĩa là container.Funds)?"
Điều bình thường là ObjectContext chỉ có một ObjectSet của lớp cơ sở trong phân cấp lớp của bạn. Không thực sự cần một ObjectSet của các lớp dẫn xuất. Để thêm và xóa các đối tượng có nguồn gốc vào/từ ObjectContext, bạn chỉ có thể sử dụng các phương thức AddObject
và DeleteObject
của ObjectSet<BaseEntity>
/BaseEntities
như bạn đã làm trong ví dụ của mình.
Để truy vấn đối tượng có nguồn gốc, bạn có thể tận dụng phương pháp OfType
của ObjectSet. Nó trả về một ObjectQuery của các loại có nguồn gốc, nơi bạn có thể xây dựng các truy vấn thêm khi:.
ObjectQuery<Fund> query = container.BaseEntities.OfType<Fund>();
(Phần đầu của câu hỏi của bạn có vẻ là một lỗi ánh xạ giữa việc lưu trữ và mô hình khái niệm nó có thể có một tốt hơn CIF bạn có thể hiển thị các phần có liên quan của tập tin edmx của bạn)
Edit:. giải pháp có thể để phần đầu của câu hỏi:
tôi đã tạo ra ví dụ của bạn với Model đầu tiên trong VS2010 và tôi có thể sinh sản của bạn vấn đề. Vấn đề dường như liên quan đến thực tế là khóa chính trong mô hình của bạn không phải là Int32
mà là một Guid
. Khi bạn thêm một thực thể mới vào Mô hình, nhà thiết kế luôn đề xuất Int32
làm khóa chính với StoreGeneratedPattern
được đặt thành Identity
.
Nếu bạn thay đổi bây giờ là loại chìa khóa trong thiết kế mô hình Int32
-Guid
nhưng để lại StoreGeneratedPattern
không thay đổi là Identity
, DDL tạo ra một cơ sở dữ liệu trong SQL Server với Id
bộ gõ uniqueidentifier
nhưng nhận dạng đặc điểm kỹ thuật cho cột đó là "Không". Vì vậy, khi EF gửi lệnh INSERT tới DB nó "nghĩ" từ định nghĩa mô hình, phần chính sẽ được tự động phát trong DB và không gửi hướng dẫn tới DB mà bạn đã gán trong mã. Nhưng DB không tạo khóa, dẫn đến giá trị NULL cho khóa. Do đó lỗi chúng tôi nhận được.
Giải pháp: Đặt trong trình thiết kế mô hình cho thuộc tính Id
của BaseEntity
số StoreGeneratedPattern
đến None
. Đối với tôi nó làm việc sau đó. Tất nhiên, bạn có trách nhiệm sau đó để luôn luôn chỉ định một hướng dẫn để Id
trước khi bạn thêm một đối tượng mới vào ObjectSet, nhưng điều đó có vẻ là những gì bạn muốn anyway.
'HybridModelContainer' là gì? Đăng ảnh chụp màn hình chi tiết bản đồ cho thực thể 'Fund' của bạn. –
Đó chỉ là tên của DataContext. – SolarX
@SolarX: Bạn có thể đăng ảnh chụp màn hình mà tôi đã đề cập không? –