sql >> データベース >  >> RDS >> Sqlserver

Entity Framework - SQL Server テーブルにデフォルト値が設定されていません

    これは、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 サーバーでデフォルトにすることを意味します。

    1. PythonスクリプトからMySQLテーブルにデータを挿入します

    2. SQLServerで一度に複数の列を変更する方法

    3. SQLでm/n接続されたテーブルの値をカウントする

    4. PostgreSQLのようなデータベースよりもRabbitMQのようなメッセージブローカーが必要なのはなぜですか?