簡體   English   中英

自動生成不是Entity Framework中主鍵的GUID列

[英]Autogenerate GUID column that is not a primary key in Entity Framework

我正在從現有的模型和數據庫轉向Entity Framework。 在該數據庫中,有幾個表具有GUID列,這些表不是主鍵(或根本不是鍵!)。 每個表都有一個ID列。 GUID列具有在其上定義的ROWGUIDCOL屬性,以及DEFAULT(newid())。

現在,當我插入數據庫時​​,我得到了這個列的所有零。

我嘗試過使用數據注釋:

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

這個問題是它丟棄了我的ID列上的標識屬性(並給我插入錯誤)。 除此之外,我注意到對於以下遷移,EF實際上為up和down方法生成了相同的SQL:

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));
}

用生成的sql:

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

為什么上面的遷移為兩個語句創建了相同的sql? 如何讓EF生成GUID? 我可以/必須在客戶端(代碼)空間中執行此操作嗎? 如果必須,我怎樣才能保證表格的唯一性?

DatabaseGenerationOption.Identity應該用於標識列。

請嘗試使用DatabaseGenerationOption.Computed。 它應該阻止EF在插入列時發送值,並且應該在SaveChanges上正確地提取db生成的值。

嘗試將預先存在的ID ident列轉換為GUID時,我遇到了一些錯誤。 計算不起作用,設置為身份不起作用。 設置為DatabaseGeneratedOption.None會導致錯誤,指出我無法在必填字段中插入空值。 我的構造函數中有一個NewGuid代,但這似乎也沒有幫助。

為了使它工作,我刪除了我的Migration .cs文件和我的數據庫,然后使用dataannotations,我能夠通過將新的GUID ID設置為Key,DatabaseGeneratedOption.None然后在ID屬性后面放置一個支持字段來打敗系統。 這迫使我的Getter查看私有字段,確定它是否為Guid.Empty,如果是,則為我生成一個新的GUID。

    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; }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM