これは、Entity Framework で問題となる数少ない問題の 1 つです。次のようなクラスがあるとします:
public class MyEntity
{
// Id is a PK on the table with Auto-Increment
public int Id { get; set; }
// CreatedOn is a datetime, with a default value
public DateTime CreatedOn { get; set; }
}
ここで、新しい要素を挿入します:
using(var context = new YourContext())
{
context.MyEntities.Add(new MyEntity())
}
Entity Framework は、EDMX の定義により、自動インクリメント主キーの処理方法を認識しています。 Id
の値を挿入しようとしません。 財産。ただし、Entity Framework に関する限り、CreatedOn
している 値:デフォルトの DateTime
. Entity Framework は「まあ、値はありますが、無視する必要があります」とは言えないため、CreatedOn
を使用して積極的にレコードを挿入します。 テーブルの列定義のデフォルト値をバイパスします。
これを行う簡単な方法はありません。 CreatedOn
を積極的に設定できます プロパティを DateTime.Now
に そのアイテムを挿入すると。または、インターフェースと拡張メソッドのペアを作成することもできます:
public interface ICreatedOn
{
public DateTime CreatedOn { get; set; }
}
public partial class MyEntity : ICreatedOn
{
}
public static TEntity AsNew<TEntity>(this TEntity entity) where TEntity : ICreatedOn
{
if(entity != null)
entity.CreatedOn = DateTime.Now;
return entity;
}
using(var context = new YourContext())
{
context.MyEntities.Add(new MyEntity().AsNew())
}
編集: この点をさらに詳しく説明すると、これが解決できない問題である理由は、autoincrement
の背後にある意味のためです。 フィールドと default
を持つフィールド 値の制約。自動インクリメント フィールドは、定義上、シードなどすべてを使用して、常にサーバーによって処理される必要があります。挿入の自動インクリメント フィールドに値を指定することはできません SET IDENTITY INSERT ON
を使用しました .ただし、デフォルト値は、「値を指定しない場合はこれを使用してください」というヒントにすぎません。 .NET の値の型は null にできないため、常に値が存在し、Entity Framework は default を推測できません。 その時点でのそのフィールドの値は、SQL サーバーでデフォルトにすることを意味します。