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 であると不平を言います。