![](/img/trans.png)
[英]Entity Framework: Cannot insert explicit value for identity column in table '[table]' when IDENTITY_INSERT is set to OFF
[英]Entity Framework Throwing Cannot Insert Explicit Value for Identity Column In Table … When IDENTITY_INSERT is set to OFF Error
我正在使用Microsoft SQL Server 2008 R2,並且具有三個相關表:ConvertCarbs,國家和州
使用EF Power Tools,我對數據庫進行了反向工程( http://msdn.microsoft.com/zh-cn/data/jj593170.aspx ),並正在嘗試使用實體框架將記錄插入ConvertCarb表中。
但是,該程序在嘗試保存更改時拋出以下錯誤:
當IDENTITY_INSERT設置為OFF時,無法在表'ConvertCarb'中為標識列插入顯式值。
這是運行時代碼:
var convertCarb = new ConvertCarb();
convertCarb.CountryID = 150;
db.ConvertCarbs.Add(convertCarb);
db.SaveChanges();
這是域模型中的類:
public partial class ConvertCarb
{
public int ConvertCarbID { get; set; }
public Nullable<int> CountryID { get; set; }
public virtual Country Country { get; set; }
}
public partial class Country
{
public Country()
{
this.ConvertCarbs = new List<ConvertCarb>();
this.Offices = new List<Office>();
}
public int CountryID { get; set; }
public string CountryName { get; set; }
public virtual ICollection<ConvertCarb> ConvertCarbs { get; set; }
}
public partial class StateProvince
{
public StateProvince()
{
this.Offices = new List<Office>();
}
public int StateProvID { get; set; }
public string StateProvAbbr { get; set; }
public virtual ConvertCarb ConvertCarb { get; set; }
public virtual ICollection<Office> Offices { get; set; }
}
進行此插入應該沒有問題,因為ConvertCarbID是“身份列”,並且我已經通過直接在數據庫上運行tsql插入來驗證了這一點。
這是數據庫中表的創建代碼:
/****** Object: Table [dbo].[ConvertCarb] Script Date: 04/11/2014 03:04:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[ConvertCarb](
[ConvertCarbID] [int] IDENTITY(1,1) NOT NULL,
[CountryID] [int] NULL,
[StateProvID] [int] NULL,
[KWH_FT2] [float] NULL,
[G_KWH] [decimal](18, 4) NULL,
[NatGas_GJ_M2] [float] NULL,
[FuelOil_GJ_M2] [float] NULL,
CONSTRAINT [PK_ConvertCarb] PRIMARY KEY CLUSTERED
(
[ConvertCarbID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[ConvertCarb] WITH NOCHECK ADD CONSTRAINT [FK_ConvertCarb_Countries] FOREIGN KEY([CountryID])
REFERENCES [dbo].[Countries] ([CountryID])
GO
ALTER TABLE [dbo].[ConvertCarb] NOCHECK CONSTRAINT [FK_ConvertCarb_Countries]
GO
ALTER TABLE [dbo].[ConvertCarb] WITH NOCHECK ADD CONSTRAINT [FK_ConvertCarb_StateProvinces] FOREIGN KEY([ConvertCarbID])
REFERENCES [dbo].[StateProvinces] ([StateProvID])
GO
ALTER TABLE [dbo].[ConvertCarb] NOCHECK CONSTRAINT [FK_ConvertCarb_StateProvinces]
GO
/****** Object: Table [dbo].[Countries] Script Date: 04/11/2014 03:04:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Countries](
[CountryID] [int] IDENTITY(1,1) NOT NULL,
[CountryName] [varchar](255) NULL,
CONSTRAINT [PK_Countries] PRIMARY KEY CLUSTERED
(
[CountryID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[StateProvinces] Script Date: 04/11/2014 03:05:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[StateProvinces](
[StateProvID] [int] IDENTITY(1,1) NOT NULL,
[StateProvAbbr] [varchar](2) NULL,
CONSTRAINT [PK_StateProvinces] PRIMARY KEY CLUSTERED
(
[StateProvID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
以下是EF工具生成的映射類:
public class ConvertCarbMap : EntityTypeConfiguration<ConvertCarb>
{
public ConvertCarbMap()
{
// Primary Key
this.HasKey(t => t.ConvertCarbID);
// Properties
// Table & Column Mappings
this.ToTable("ConvertCarb");
this.Property(t => t.ConvertCarbID).HasColumnName("ConvertCarbID");
this.Property(t => t.CountryID).HasColumnName("CountryID");
this.Property(t => t.StateProvID).HasColumnName("StateProvID");
this.Property(t => t.KWH_FT2).HasColumnName("KWH_FT2");
this.Property(t => t.G_KWH).HasColumnName("G_KWH");
this.Property(t => t.NatGas_GJ_M2).HasColumnName("NatGas_GJ_M2");
this.Property(t => t.FuelOil_GJ_M2).HasColumnName("FuelOil_GJ_M2");
// Relationships
this.HasOptional(t => t.Country)
.WithMany(t => t.ConvertCarbs)
.HasForeignKey(d => d.CountryID);
this.HasRequired(t => t.StateProvince)
.WithOptional(t => t.ConvertCarb);
}
}
public class CountryMap : EntityTypeConfiguration<Country>
{
public CountryMap()
{
// Primary Key
this.HasKey(t => t.CountryID);
// Properties
this.Property(t => t.CountryName)
.HasMaxLength(255);
// Table & Column Mappings
this.ToTable("Countries");
this.Property(t => t.CountryID).HasColumnName("CountryID");
this.Property(t => t.CountryName).HasColumnName("CountryName");
}
}
public class StateProvinceMap : EntityTypeConfiguration<StateProvince>
{
public StateProvinceMap()
{
// Primary Key
this.HasKey(t => t.StateProvID);
// Properties
this.Property(t => t.StateProvAbbr)
.HasMaxLength(2);
// Table & Column Mappings
this.ToTable("StateProvinces");
this.Property(t => t.StateProvID).HasColumnName("StateProvID");
this.Property(t => t.StateProvAbbr).HasColumnName("StateProvAbbr");
}
}
此關系映射...
this.HasRequired(t => t.StateProvince)
.WithOptional(t => t.ConvertCarb);
...表示在共享主鍵一對一關系中, StateProvince
是委托人,而ConvertCarb
是依賴人。 在那種情況下,EF假定只有主體可以具有身份主鍵,而不具有從屬的ConvertCarb
(因為從屬必須始終具有與主體相同的PK值)。 基本上,此關系禁用ConvertCarb
實體的標識約定。 結果,EF將ConvertCarb
實體的PK值(無論是手動提供還是默認提供)發送到數據庫( ConvertCarbID
列是INSERT語句的一部分),這會引發數據庫異常,因為ConvertCarbID
列被標記為身份。
但是我不知道為什么EF從數據庫中獲取了一對一的關系,因為在數據庫腳本中看不到StateProvince
的FK約束。 還是后來將約束添加到數據庫了?
public class ConvertCarbMap : EntityTypeConfiguration<ConvertCarb>
{
public ConvertCarbMap()
{
// Primary Key
this.HasKey(t => t.ConvertCarbID);
// Properties
this.HasKey(t => t.ConvertCarbID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
// Table & Column Mappings
this.ToTable("ConvertCarb");
this.Property(t => t.ConvertCarbID).HasColumnName("ConvertCarbID");
this.Property(t => t.CountryID).HasColumnName("CountryID");
this.Property(t => t.StateProvID).HasColumnName("StateProvID");
this.Property(t => t.KWH_FT2).HasColumnName("KWH_FT2");
this.Property(t => t.G_KWH).HasColumnName("G_KWH");
this.Property(t => t.NatGas_GJ_M2).HasColumnName("NatGas_GJ_M2");
this.Property(t => t.FuelOil_GJ_M2).HasColumnName("FuelOil_GJ_M2");
// Relationships
this.HasOptional(t => t.Country)
.WithMany(t => t.ConvertCarbs)
.HasForeignKey(d => d.CountryID);
this.HasRequired(t => t.StateProvince)
.WithOptional(t => t.ConvertCarb);
}
}
在HasDatabaseGeneratedOption中使用DatabaseGeneratedOption.Identity。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.