";无法修改列[ColumnName=Id]”-使用实体框架5

本文关键字:框架 实体 Id quot 修改 ColumnName | 更新日期: 2023-09-27 18:30:09

我有一个表,其中一列定义为Identity列,增量为1。我的问题和这个几乎完全一样。。。但是,我的代码有点不同。我正在使用每类型表(TPT)继承将我的实体框架代码编写为代码优先。我在SQL CE数据库中有一个ContractHead表、一个RentalContract表和一个StorageContract表。相应的RentalContract和StorageContract实体源自ContractHead实体。

[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属性修饰了主键属性。事实上,当我第一次添加这个时,为了解决这个问题,我成功地添加了一个记录。。。只有一个。。。之后,错误返回。当我创建一个新的Contract实例时,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的标识列。英孚不知道吗?这不是"DatabaseGenerated"属性告诉框架的内容吗?为什么它试图设置该字段的值?

困惑!

";无法修改列[ColumnName=Id]”-使用实体框架5

问题是表示派生对象的表(StorageContract和RentakContract)都将ID字段标识为IDENTITY字段,这是一个问题。一旦我重新定义了它们,使它们不是IDENTITY列,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
);