簡體   English   中英

實體框架:IDENTITY_INSERT問題 - “無法在表中插入標識列的顯式值”

[英]Entity Framework: Issue with IDENTITY_INSERT - “Cannot insert explicit value for identity column in table”

我正在使用帶有C#.NET的Entity Framework 4.0。 我正在嘗試創建一個“簡單”的遷移工具,將數據從一個表轉換為另一個表(表格不一樣)

該數據庫是SQL Server 2005。

我有一個類似於以下目標DB結構:

MYID - int, primary key, identity specification (yes)
MYData - varchar(50)

在我的遷移程序中,我將DB結構導入edmx。 然后我手動關閉StoreGeneratedPattern。

在我的遷移程序中,我按如下方式關閉標識列(我已經確認它確實將其關閉):

            using (newDB myDB = new newDB())
            {
                //turn off the identity column 
                myDB.ExecuteStoreCommand("SET IDENTITY_INSERT SR_Info ON");
            }

在上面的代碼之后,我有以下代碼:

            using (newDB myDB = new newDB())
            {
                DB_Record myNewRecord = new DB_Record();
                //{do a bunch of processing}
                myNewRecord.MYID = 50;
                myDB.AddToNewTable(myNewRecord);
                myDB.SaveChanges();
            }

當它到達myD​​B.SaveChanges()時,它會生成一個異常:“無法為表中的標識列插入顯式值”。

我知道當我手動轉到SQL Server表並關閉身份規范時,代碼工作正常。

我的偏好是讓遷移工具處理打開和關閉身份規范,而不必在數據庫上手動執行。 此遷移工具將用於沙箱數據庫,開發人員數據庫,QA數據庫,然后是生產數據庫,因此完全自動化將很好。

讓這個工作正常的任何想法?

我使用了以下步驟:

  1. 使用標識列創建數據庫表。
  2. 在Visual Studio中,添加新的EDMX。
  3. 在EDMX上,我從數據庫中選擇更新模型(並選擇添加所需的表)
  4. 在EDMX上,我單擊MYID,在屬性窗格中,我將StoreGeneratedProcedure設置為None。

此時,當我添加一個設置了MYID的新記錄時,DB會使用Identity值覆蓋MYID的值。

到目前為止,無論我在哪里添加“myDB.ExecuteStoreCommand(”SET IDENTITY_INSERT SR_Info ON“);”,它的行為都是一樣的。

我試過添加一個存儲過程,它也無法正常工作。

我懷疑最終,遷移不會完全自動化。

當列是標識時,從實體框架插入記錄將引發以下錯誤:

當IDENTITY_INSERT設置為OFF時,無法在表'MY_ENTITY'中為標識列插入顯式值。 避免錯誤設置實體屬性StoreGeneratedPattern =“Identity”

<EntityType Name="MY_ENTITY">
    <Key>
        <PropertyRef Name="UserID" />
    </Key>
    <Property Name="RecordID" Type="int" StoreGeneratedPattern="Identity" Nullable="false" />
</EntityType>
protected override void OnModelCreating(DbModelBuilder modelBuilder)       
{
    modelBuilder.Entity<EntityClass>().HasKey(p => p.Id);

    modelBuilder.Entity<EntityClass>()
        .Property(c => c.Id)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

    base.OnModelCreating(modelBuilder);   
}

這看起來很有希望使用IDENTITY_INSERT和EF4

您基本上需要確保您的數據模型知道您對數據庫所做的更改,因為它們現在不再與基礎表同步。

但是,我不建議使用EF作為重量級數據加載工具。 首選SQL或ETL工具。

暫無
暫無

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

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