2008-09-23 14 views
48

Khung thực thể có nhận biết các cột nhận dạng không?ADO.NET Entity Framework và các cột nhận dạng

Tôi đang sử dụng SQL Server 2005 Express Edition và có nhiều bảng trong đó khóa chính là cột nhận dạng. khi tôi sử dụng các bảng này để tạo mô hình thực thể và sử dụng mô hình kết hợp với một liên kết nguồn dữ liệu thực thể cho một formview để tạo một thực thể mới, tôi được yêu cầu nhập một giá trị cho cột nhận dạng. Có cách nào để làm cho khung không yêu cầu các giá trị cho các cột nhận dạng không?

Trả lời

2

Khung pháp nhân nhận thức và có thể xử lý các cột nhận dạng.

Vấn đề của bạn có thể không phải là chính bản thân EF mà là dạng xem được tạo ra của nó. Cố gắng xóa đầu vào cho cột nhận dạng từ biểu mẫu chèn và xem điều gì xảy ra.

4

Bạn nên đặt thông số nhận dạng của cột nhận dạng sao cho thuộc tính (Nhận dạng) được đặt thành true. Bạn có thể làm điều này trong thiết kế bảng của bạn trong SSMS. Sau đó, bạn có thể cần phải cập nhật mô hình dữ liệu thực thể.

Có lẽ điều bạn muốn nói bằng cách nói "Khóa chính là cột nhận dạng" hoặc có thể bạn đã bỏ lỡ bước này.

2

Nếu mọi thứ khác không thành công trước khi bạn tách tóc ra - hãy thử xóa EntityModel và nhập lại từ SQL Server. Nếu bạn đã tinh chỉnh các khóa và các mối quan hệ và dựa vào chức năng 'cập nhật mô hình từ cơ sở dữ liệu', nó vẫn còn lỗi một chút trong phiên bản RC mà tôi đã tìm thấy - một lần nhập mới có thể hữu ích.

+0

Điều này vẫn còn đúng 7 năm sau đó. Làm mới không nhận được các thay đổi chính của tôi. Tạo một mô hình mới đã giải quyết được vấn đề. – nunzabar

67

Tôi biết bài đăng này khá cũ, nhưng điều này có thể giúp người tiếp theo đến nghe thông qua tìm kiếm của Google cho "Entitiy Framework" và "Identity".

Dường như các khung thực thể không tôn trọng các khóa chính do máy chủ tạo, vì trường hợp sẽ là nếu thuộc tính "Identity" được đặt. Tuy nhiên, mô hình bên ứng dụng vẫn yêu cầu một khóa chính được cung cấp theo phương thức CreateYourEntityHere. Khóa được chỉ định ở đây sẽ bị hủy theo lệnh gọi SaveChanges() đến ngữ cảnh.

Trang here cung cấp thông tin chi tiết về vấn đề này.

1

Khuôn khổ đối tượng không hiểu đầy đủ Danh tính vì một lý do nào đó. Giải pháp đúng là đặt Setter cho cột đó thành Riêng tư. Điều này sẽ làm cho bất kỳ giao diện người dùng được tạo nào hiểu rằng nó không được đặt giá trị danh tính vì không thể thiết lập trường riêng tư.

+0

Trong trường hợp này, bạn sẽ không thể chỉnh sửa thực thể thông qua khóa, vì giá trị sẽ là 0 cho đối tượng được cập nhật và bạn sẽ không thể lưu các thay đổi được cập nhật khi bạn không thể tìm thấy đối tượng trong bộ sưu tập qua khóa. (trường hợp này là dành cho MVC) – Chinjoo

0

Điều gì đã hiệu quả đối với tôi là đặt StoreGeneratedPattern thành None, khi đó là cột Identity. Bây giờ tất cả đều hoạt động liên tục. Vấn đề chính với điều này là chỉnh sửa các mô hình là một việc vặt cực đoan nếu bạn có nhiều mô hình.

3

Đây là câu trả lời hay nhất tôi đã xem. Bạn phải chỉnh sửa thủ công lớp lưu trữ xml để đặt StoreGeneratedPattern="Identity" trên mỗi khóa chính của loại UniqueIdentifier có giá trị mặc định được đặt thành NewID().

http://web.archive.org/web/20130728225149/http://leedumond.com/blog/using-a-guid-as-an-entitykey-in-entity-framework-4/

+0

Sau khi đọc lời khuyên này, tôi tìm thấy một danh tính còn thiếu đã được thêm vào, nhưng EF cần phải thả và làm mới đối tượng trong mô hình dữ liệu thực thể để sửa mọi thứ. – goosemanjack

0

Tôi không thể tin được. Intellisensing ItemCollection mang lại một mục với ID = 0 sau SaveChanges.

  Dim ItemCollection = From d In action.Parameter 
      Select New STOCK_TYPE With { 
         .Code = d.ParamValue.<Code>.Value, 
         .GeneralUseID = d.ParamValue.<GeneralUse>.Value, 
      } 


      GtexCtx.STOCK_TYPE.AddObject(ItemCollection.FirstOrDefault) 
      GtexCtx.SaveChanges() 

Không có vấn đề gì tôi làm. Sau 8 giờ kể cả xóa mô hình của tôi, 35 lần xây dựng và xây dựng lại, thử nghiệm và chỉnh sửa XML của EDMX và bây giờ gần như sắp xóa toàn bộ cơ sở dữ liệu SQL Server của tôi.Tại biên dịch 36, giải pháp dumbfounding này làm việc

  Dim abc = ItemCollection.FirstOrDefault 
      GtexCtx.STOCK_TYPE.AddObject(abc) 
      GtexCtx.SaveChanges() 

abc.ID mang 41 (bản sắc tôi cần)

EDIT: Đây là một mã đơn giản để suy nghĩ cho Looping AddObject và vẫn nhận được ID

Dim listOfST As List(Of STOCK_TYPE) = ItemCollection.ToList() 
     For Each q As STOCK_TYPE In listOfST 
     GtexCtx.STOCK_TYPE.AddObject(q) 
     Next 
GtexCtx.SaveChanges() 

...more code for inter-relationship tables 

Hãy thử danh sách IntellisenceOfST sau SaveChanges và bạn sẽ tìm thấy ID được cập nhật. Có thể có cách nào tốt hơn nhưng khái niệm này là có

2

Trong C# bạn có thể làm một cái gì đó như thế này để làm cho nó biết:

Trong FooConfiguration.cs : EntityTypeConfiguration<Foo> của bạn:

this.Property(x => x.foo).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

Sau đó, để sử dụng nó, chỉ cần nhớ chèn mục vào ngữ cảnh và gọi context.SaveChanges() trước khi sử dụng x.foo để nhận giá trị tăng tự động cập nhật. Nếu không, x.foo sẽ chỉ bằng 0 hoặc null.

5

Nếu bạn đang sử dụng Entity Framework 5, bạn có thể sử dụng thuộc tính sau.

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]