2016-04-13 10 views
1

私はEFで本当に新たなんだ、と私は問題とsuddenylこだわっている:エンティティフレームワークの列とエンティティの相関?

 var _entity = new TestEntity(); 

     _entity.Customers.Add(new Customers { Description = "John" }); 
     _entity.Customers.Add(new Customers { Customer_ID = 1, Description = "Steve" }); 

     try 
     { 
      _entity.SaveChanges(); 
     } 
     catch (System.Data.Entity.Validation.DbEntityValidationException) 
     { 
      Debug.Print("Validation Error"); 
     } 

このコードを実行した後、私は例外なく2つのレコードinsterted結果を持っているが、私の問題がありますそのCustomer_IDフィールドはnullを許可せず、デフォルト値を定義します。しかし、 "John" -recordにはCustomer_ID:0が挿入されています。 (もちろん、正しいID:1の「Steve」-recordも)

どのようにすれば、値を挿入する前にもっと深く検証し、コードで定義されていない場合は挿入しないでください。

モデルクラスはここにある:

[Key] 
    [Column(Order = 0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Customer_ID { get; set; } 

    [Column(Order = 1)] 
    [StringLength(50)] 
    public string Description { get; set; } 

は、int型のデフォルト値はnullでなく、あなたがDBにそれを挿入することができましたこれは0であるあなたに

答えて

1

ありがとうございます。 Customer_IDが0より大きい値に割り当てられているかどうか確認する場合は、Range属性を試してみてください。

[Key] 
[Column(Order = 0)] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
[Range(1, Int32.MaxValue, ErrorMessage = "Value for {0} must be larger than 0.")] 
public int Customer_ID { get; set; } 

別の醜いソリューションはint?にプロパティタイプを変更マーキングし、このようRequired属性を適用される場合があります。

[Key] 
[Column(Order = 0)] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
[Required] 
public int? Customer_ID { get; set; } 
+0

@GertArnold訂正ありがとう –

-1

CUSTOMER_IDがnull受け入れるかしないようにするためにあなたがしたいかどうかは明らかではないでしょうか? public int Customer_ID {get;セット; }はデフォルト値0を持つので、正しいものが得られます。

試してみる必要がある場合:それは大丈夫

public int? Customer_ID { get; set; } 
+0

さて、SQL側のテーブル定義では、Customer_IDはnullを許可していません。私のコードでは、私はJohnレコードの値を定義していないので、私の見地からは、Customer_IDの値を与えないので、デフォルトでnullになり、例外が発生します。注意してください。あなたはIDの値を定義しません。 – user1692315

+1

C#では、Customer_ID型のint型のプロパティがあり、これはCustomer_IDのデフォルト値が0であることを意味します。つまり、dbにNULLを表示するには、propertyとしてnullable型を持つ必要があります。 Customer_ID {get;セット; }。新しい行にはnullが入ります。 – Catalin

+0

これを確認したら、新しい行を追加する必要があります。 – Catalin

1

nullにできるかどう

[Required] 
public int Customer_ID { get; set; } 

を、私はそれを得ました。

だから私は、nullとして値に署名する必要があります

[Key] 
[Column(Order = 0)] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
public int? Customer_ID { get; set; } 

そして、この場合には、私はちょうどDbUpdateExceptionを持っています。たぶん解決策かもしれませんが、ベストではないかもしれないので、他の提案も歓迎します。

+1

それは私がしていることです。 –

1

データベース側では、Customer_IDにCHECK制約を設定して、0を許可しないようにすることを強くお勧めします。これにより、アプリケーションの間違いがデータベースに漏れることが防止されます。

関連する問題