2014-10-14 16 views
5

Tôi đang chuyển sang Khung thực thể từ mô hình và cơ sở dữ liệu hiện có. Trong cơ sở dữ liệu đó, có một số bảng có các cột GUID không phải là các khóa chính (hoặc các khóa ở tất cả!). Mỗi bảng có một cột ID. Các cột GUID có thuộc tính ROWGUIDCOL được định nghĩa trên chúng, cũng như một DEFAULT (newid()).Cột GUID tự tạo không phải là khóa chính trong Khuôn khổ thực thể

Bây giờ, khi tôi chèn vào DB, tôi nhận được tất cả các số không cho cột này.

Tôi đã cố gắng sử dụng các chú thích dữ liệu:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public Guid Guid {get; set;} 

Vấn đề ở đây là nó giảm tài sản nhận dạng trên cột ID của tôi (và mang lại cho tôi chèn lỗi). Ngoài ra, tôi nhận thấy rằng đối với sự di cư sau, EF thực sự tạo SQL giống hệt nhau cho cả hai phương pháp lên xuống:

public override void Up() 
{ 

    AlterColumn("dbo.Client", "Guid", c => c.Guid(nullable: false, identity: true)); 
} 

public override void Down() 
{ 
    AlterColumn("dbo.Client", "Guid", c => c.Guid(nullable: false)); 
} 

Với sql tạo của:

ALTER TABLE [dbo].[Client] ALTER COLUMN [Guid] [uniqueidentifier] NOT NULL 

Tại sao di cư trên tạo cùng sql cho cả hai câu lệnh? Làm thế nào để tôi có EF để tạo GUID? Tôi có thể/tôi phải làm điều này trong không gian khách hàng (mã)? Nếu tôi phải, làm thế nào tôi có thể đảm bảo tính duy nhất trên các bảng?

+0

Tôi không biết EF nhưng có vẻ như bạn đang gây nhầm lẫn về đặc tính nhận dạng và giá trị mặc định. Một kiểu dữ liệu GUID không thể có thuộc tính "identity" trong máy chủ SQL – jazzytomato

+0

Khóa chính của bạn có được trang trí với thuộc tính [Key] không? – Keith

+1

DatabaseGenerationOption.Identity nên được sử dụng cho cột nhận dạng. Bạn đã thử DatabaseGenerationOption.Computed thay thế chưa? Nó sẽ ngăn EF gửi một giá trị khi chèn cột, và nó sẽ kéo giá trị tạo ra db đúng trên SaveChanges – ESG

Trả lời

2

DatabaseGenerationOption.Identity nên được sử dụng cho cột nhận dạng.

Hãy thử sử dụng DatabaseGenerationOption.Computed thay thế. Nó sẽ ngăn không cho EF gửi một giá trị khi chèn cột, và nó sẽ kéo giá trị tạo ra db đúng trên SaveChanges.

+0

isnt Có cách nào để làm điều đó trong DB đầu tiên và EF thừa hưởng (tự động tạo ra) thiết lập này vào lớp Poco hơn là thiết lập chú thích bằng tay? – batmaci

+0

Tôi không phải siêu quen thuộc với db đầu tiên, nhưng tôi sẽ ngạc nhiên nếu nó đã làm. – ESG

1

Tôi đã gặp một số lỗi khi cố gắng chuyển đổi các cột nhận dạng ID đã tồn tại từ trước thành GUID. Tính toán sẽ không hoạt động, thiết lập như danh tính sẽ không hoạt động. Thiết lập để DatabaseGeneratedOption.None sẽ gây ra lỗi nói tôi không thể chèn một null trong lĩnh vực yêu cầu. Tôi đã có một thế hệ NewGuid trong nhà xây dựng của mình, nhưng điều đó dường như không giúp được gì.

Để có được nó để làm việc, tôi đã xóa file Migration tôi cs và cơ sở dữ liệu của tôi, sau đó dùng dataannotations, tôi đã có thể đánh bại hệ thống bằng cách thiết lập ID GUID mới để Key, DatabaseGeneratedOption.None và sau đó đặt một lĩnh vực sao lưu phía sau thuộc tính ID. Điều này buộc Getter của tôi phải nhìn vào lĩnh vực tư nhân, xác định nếu nó đã được Guid.Empty, và nếu như vậy, để tạo ra một GUID mới cho tôi.

private Guid id = Guid.Empty; 

    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] 
    [HiddenInput(DisplayValue = false)] 
    public Guid CompanyId 
    { 
     get 
     { 
      if(id==Guid.Empty) 
       id = new Guid(); 
      return id; 
     } 
     set { id = value; } 
    } 
Các vấn đề liên quan