0

Entity Framework 5 を使用して、SQL Server 2012 データベースに新しい Answer レコードを作成しています。

回答クラスは次のとおりです。

public class Answer
{
    public int? AnswerId { get; set; }
    public string Text { get; set; }

}

SQL:

CREATE TABLE Answer (
   [AnswerId] INT IDENTITY (1, 1) NOT NULL,
   ...
   ...
   CONSTRAINT [PK_Answer] PRIMARY KEY CLUSTERED ([AnswerId] ASC)

EF マッピングは次のとおりです。

public class AnswerMap : EntityTypeConfiguration<Answer>
{
    public AnswerMap()
    {
        // Primary Key
        this.HasKey(t => t.AnswerId);

        // Identity
        this.Property(t => t.AnswerId)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

    }
}

ただし、AnswerId に null を指定して新しい Answer を挿入すると、次のようになります。

キー フィールド 'AnswerId' の値を null にすることはできません。タイプ 'Answer' で定義されたキー フィールドには、null 以外の値が必要です。

System.InvalidOperationException was unhandled by user code
  HResult=-2146233079
  Message=The key field 'AnswerId' cannot have a value of null. A non-null value is required for the key fields defined on type 'Answer'.
  Source=System.Data.Entity
  StackTrace:
       at System.Data.Objects.ObjectStateManager.CreateEntityKey(EntitySet entitySet, Object entity)
       at System.Data.Objects.ObjectContext.AttachSingleObject(IEntityWrapper wrappedEntity, EntitySet entitySet, String argumentName)
       at System.Data.Objects.DataClasses.RelatedEnd.AddEntityToObjectStateManager(IEntityWrapper wrappedEntity, Boolean doAttach)
       at System.Data.Objects.DataClasses.RelatedEnd.AddGraphToObjectStateManager(IEntityWrapper wrappedEntity, Boolean relationshipAlreadyExists, Boolean addRelationshipAsUnchanged, Boolean doAttach)
       at System.Data.Objects.DataClasses.RelatedEnd.IncludeEntity(IEntityWrapper wrappedEntity, Boolean addRelationshipAsUnchanged, Boolean doAttach)
       ....

では、POCO クラスを追加するにはどうすればよいでしょうか。私ができる唯一のことは、データベースで生成された番号であるため、 AnswerId を null に設定することです。しかし、それを行うと、EF の ID 列であると指定したにもかかわらず、EF はそれが null であると不平を言います。

4

1 に答える 1

2

Answerクラスを次のように変更します。

public class Answer
{
    public int AnswerId { get; set; }
    public string Text { get; set; }
}

主キーの値は、データベースの挿入後に Entity Framework によって自動的に設定されます。

AnswerId を自分で変更しないでください。そのままにしておいてください。まだ挿入されていないオブジェクトの場合はゼロになります。

于 2013-07-30T09:20:37.120 に答える