2016-06-09 22 views
1

我必須使用代碼首先被拋出此錯誤WebApi2 /實體框架項目:無法插入的標識列顯式值

Cannot insert explicit value for identity column in table 'Sessions' when IDENTITY_INSERT is set to OFF.

這是模型:

public class Session 
{ 
    [Key, ForeignKey("Device")] 
    public long Id { get; set; } 
    public virtual Device Device { get; set; } 
} 
public class Device 
{ 
    [Key] 
    public long Id { get; set; } 
    public long AnalyticsId { get; set; } 
    [ForeignKey("AnalyticsId")] 
    public Session AnalyticsSession { get; set; } 
} 

控制器:

public async Task<IHttpActionResult> PostSession(SessionInitialDTO sessionDTO) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     Session session = new Session(); 

     db.Sessions.Add(session); 

     Analytics.Models.Device device = sessionDTO.Device; 
     device.AnalyticsSession = session; 

     db.Devices.Add(device); 

     await db.SaveChangesAsync(); 

     return CreatedAtRoute("CreateInitialSession", new { id = session.Id }, session); 
    } 

我讀過的所有內容都說這個問題來自於試圖將一個IDENTITY列設置爲一個值,但據我所知,我並沒有試圖這樣做(或者至少如果我是,我沒有看到哪裏)。 DTO中的Device對象不會設置Id。我已經看到了一些東西使用[DatabaseGenerated(DatabaseGeneratedOption.Identity)]批註指定該字段自動生成的建議,但這然後導致的,因爲ForeignKey的

這是生成的表格代碼問題:

CREATE TABLE [dbo].[Sessions] (
    [Id]   BIGINT   IDENTITY (1, 1) NOT NULL, 
    CONSTRAINT [PK_dbo.Sessions] PRIMARY KEY CLUSTERED ([Id] ASC), 
    CONSTRAINT [FK_dbo.Sessions_dbo.Devices_Id] FOREIGN KEY ([Id]) REFERENCES [dbo].[Devices] ([Id]) 
); 

CREATE TABLE [dbo].[Devices] (
    [Id]     BIGINT   IDENTITY (1, 1) NOT NULL, 
    [AnalyticsId]   BIGINT   NOT NULL, 
    CONSTRAINT [PK_dbo.Devices] PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

奇怪的是,這用於工作,我對模型做了一些更改,開始獲取此模型,恢復到此版本的模型,並且錯誤仍然存​​在。

回答

1

沒有試圖理解如果模型符合要求(一個設備可以有一個或零會話),你正在試圖建立這樣一個會話1-1的關係。 Id不能自動生成(默認情況下EF是自動生成的整數鍵)。
要指定它,您可以將屬性[DatabaseGenerated(DatabaseGeneratedOption.None)]添加到Session.Id屬性。
之後,您需要遷移數據庫,因爲Session.Id不會是一個IDENTITY。

+0

根據您對1-1關係的評論,我最終重構了數據庫,以便將設備數據存儲在會話表中,從而消除了外鍵問題。 –

1

問題是Session.Id是標識列。首先創建設備記錄並嘗試設置會話外鍵 - 標識。

必須禁用身份:

public class Session 
{ 
    [Key, ForeignKey("Device")] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public long Id { get; set; } 
    public virtual Device Device { get; set; } 
} 
相關問題