C# &引用;无法修改该列[ColumnName=Id]";-使用实体框架5
我有一个表,其中一列定义为递增1的标识列。我的问题几乎和。。。然而,我的代码有点不同。我首先使用每类型表(TPT)继承将实体框架代码编写为代码。我在SQL CE数据库中有一个ContractHead表、一个RentalContract表和一个StorageContract表。相应的RentalContract和StorageContract实体源自ContractHead实体C# &引用;无法修改该列[ColumnName=Id]";-使用实体框架5,c#,.net,sql,sql-server,entity-framework,C#,.net,Sql,Sql Server,Entity Framework,我有一个表,其中一列定义为递增1的标识列。我的问题几乎和。。。然而,我的代码有点不同。我首先使用每类型表(TPT)继承将实体框架代码编写为代码。我在SQL CE数据库中有一个ContractHead表、一个RentalContract表和一个StorageContract表。相应的RentalContract和StorageContract实体源自ContractHead实体 [DataContract] [Table("ContractHead")] public class Contract
[DataContract]
[Table("ContractHead")]
public class Contract
{
[Key]
[DataMember]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Int64 Id { get; set; }
[DataMember]
[Column("ContactName")]
[DataType(DataType.Text)]
public String ContactName { get; set; }
[DataMember]
[DataType(DataType.EmailAddress)]
[Column("ContactEmail")]
public String ContactEmail { get; set; }
[DataMember]
[DataType(DataType.Text)]
[Column("ContactAddress1")]
public String ContactAddress1 { get; set; }
//
// ... MORE PROPERTIES
}
[DataContract]
[Table("ContractRental")]
public class RentalContract : Contract
{
[DataMember]
[Column("BoatMake")]
public String BoatMake { get; set; }
[DataMember]
[Column("BoatYear")]
public Int32? BoatYear { get; set; }
[DataMember]
[Column("BoatBeam")]
public Decimal? BoatBeam { get; set; }
[DataMember]
[Column("BoatType")]
[DataType(DataType.Text)]
public String BoatType { get; set; }
//
// ... MORE PROPERTIES
}
[DataContract]
[Table("ContractStorage")]
public class StorageContract : Contract
{
[DataMember]
[Column("BoatMaxWidth")]
public Decimal? BoatMaxWidth { get; set; }
[DataMember]
[ColumnAttribute("WidthUOM")]
[DataType(DataType.Text)]
public String WidthUOM { get; set; }
[DataMember]
[Column("LaunchDate")]
[DataType(DataType.Date)]
public DateTime? LaunchDate { get; set; }
[DataMember]
[Column("TotalCharge")]
public Decimal? TotalCharge { get; set; }
//
// ... MORE PROPERTIES
}
如您所见,我用DatabaseGenerated属性修饰了主键属性。事实上,当我第一次添加这个时,为了解决这个问题,我成功地添加了一个记录。。。就一个。。。之后,错误返回。当我创建一个合同的新实例时,ID被赋值为0。由于它是一个关键字段,我假设它是1)必需的2)填充了它的默认值,因为我没有显式地设置它。定义新契约后,它将传递给一个方法,该方法实现基本的EF Add()方法,用于添加新实体
private PikeMarine.Core.Models.RentalContract MapRentalContract()
{
PikeMarine.Core.Models.RentalContract contract = new Core.Models.RentalContract();
//
// (Code omitted) Fields are assigned values from form fields here ... The ID property is left unassigned
//
AddRentalContract(RentalContract contract);
}
public RentalContract AddRentalContract(RentalContract contract)
{
RentalContract ret = (RentalContract)base.db.Contracts.Add(contract);
base.db.SaveChanges();
return ret;
}
在调用SaveChanges()时生成错误。当我试图插入新记录,但我得到的错误
"The column cannot be modified [ColumnName = Id]"
我对此感到困惑,因为数据库(ContractHead表)中的ID字段被设置为自动生成并递增1的标识列。EF不知道吗?这不是“DatabaseGenerated”属性告诉框架的吗?为什么它试图设置该字段的值
糊涂了 问题在于,表示派生对象(StorageContract和RentakContract)的表都将ID字段标识为标识字段,这是一个问题。一旦我重新定义了它们,使它们不再是标识列,ADD函数就开始工作了 之前
CREATE TABLE [ContractHead]
(
[Id] BIGINT NOT NULL IDENTITY (1,1),
-- Field definitions
);
CREATE TABLE [StorageContract]
(
[Id] BIGINT NOT NULL IDENTITY (1,1), -- unique constraint, foreign key to ContractHead.Id
-- Field definitions
);
CREATE TABLE [RentalContract]
(
[Id] BIGINT NOT NULL IDENTITY (1,1), -- unique constraint, foreign key to ContractHead.Id
-- Field definitions
);
之后
CREATE TABLE [ContractHead]
(
[Id] BIGINT NOT NULL IDENTITY (1,1),
-- Field definitions
);
CREATE TABLE [StorageContract]
(
[Id] BIGINT NOT NULL, -- unique constraint, foreign key to ContractHead.Id
-- Field definitions
);
CREATE TABLE [RentalContract]
(
[Id] BIGINT NOT NULL, -- unique constraint, foreign key to ContractHead.Id
-- Field definitions
);
db
aDbContext
?而且是db.Contracts
aDbSet
?对不起。。。是和是这是哪个SQL-CE版本?SqlServerCompact 4.0.8854.1——目标框架4.5