0

1 ずつインクリメントされた ID 列として定義された列を持つテーブルがあります。私の問題はこれとほとんど同じです...ただし、私のコードは少し異なります。Table-Per-Type (TPT) 継承を使用して、Entity Framework コードを Code First として記述しています。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 属性で装飾しました。実際、これを最初に追加したとき、この問題を解決するために、レコードを 1 つだけ追加することに成功しました。その後、エラーが返されました。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 ずつインクリメントされる ID 列として設定されているため、これについて混乱しています。EF はこれを認識していませんか? 「DatabaseGenerated」属性がフレームワークに伝えているのはそれではないでしょうか? そのフィールドの値を設定しようとしているのはなぜですか?

混乱している!

4

1 に答える 1

0

問題は、派生オブジェクト (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
);
于 2013-09-15T02:06:51.593 に答える