13

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]この属性を使用する EF5 コードの最初のプロジェクトがあります。
このオプションは私の設定を上書きしています。

次の SQL テーブルを検討してください。

CREATE TABLE Vehicle (
  VehicleId  int identity(1,1) not null,
  Name varchar(100) not null default ('Not Set')
)

[Name] が設定されていない場合は、SQL のデフォルト コンストラクトを使用して設定しています。

コード ビハインドでは、次のようなクラスが定義されています。

public class Vehicle {
   ...

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public string ShoulderYN { get; set; }
}

コードでエンティティを更新すると、デフォルトで設定された値が新しい設定を上書きします。

コードでは、(疑似):

vehicle.Name = 'Update Name of Vehicle';
_dbContext.Update(vehicle);
_dbContext.SaveChanges();

期待される結果はVehicle.Name = 'Update Name of Vehicle'です。
実際の結果はVehicle.Name = 'Not Set'.

EF5 で言う方法はあり
ますか: Vehicle.Name が null/empty の場合、データベースで定義された値を使用しますか? それ以外の場合、コードで値を設定すると、この値を使用したいと思います。

4

3 に答える 3

15

どうやら、そうではありません。それはそれほどスマートではありません:)

すでに読んでいるかもしれませんが、Computed オプションは、DB 側で値を自分で計算するため、列を更新しないように EF に指示するだけです。EFは、データベースから新しく計算された値を返すだけです(あなたの場合は「設定されていません」)。

基本的な 3 つのオプションは次のとおりです。EF ソース コード ドキュメントによると、次のとおりです。

  • なし - データベースは値を生成しません。
  • ID - 行が挿入されると、データベースは値を生成します。
  • 計算済み - 行が挿入または更新されると、データベースは値を生成します。

https://github.com/aspnet/EntityFramework6/blob/527ae18fe23f7649712e9461de0c90ed67c3dca9/src/EntityFramework/DataAnnotations/Schema/DatabaseGeneratedOption.cs

もう少しカスタム ロジックを実行する必要があるため、自分で実行する必要があると思います。データベースのデフォルトの制約に依存するのをやめ、すべてをコード ファースト アプローチで行うことをお勧めします。このようにして、次のようなコードが得られます。

public class Vehicle
{
  public Vehicle()
  {
    this.Name = "Not set";
  }
  
  // Without 'Generated' attribute
  public string Name { get; set; }
}

このようにして、エンティティが作成されると、予想されるデフォルト値で自動的に開始されます。また、後で Name プロパティを変更するだけで変更できます。

それが役に立てば幸い!

于 2013-12-27T12:38:45.930 に答える
0

良い答えを得るためにこれを何時間もチェックしましたが、いいえ: EF は自動生成された ID でモデルを更新できません。

次の 3 つのオプションがあります。

  1. Vehicle モデルに別の VehicleId を追加します。
  2. 自動生成 ID を手動生成に変更します。
  3. モデルで生成された ID 以外の一意の識別子を設定します。車両クラスでは、Name プロパティにすることができます。

オプション 3: unique-id を Vehicle.Name に設定することをお勧めします (さらにプロパティを追加できます)。次に: 一意の ID による車両が存在しない場合は、新しい車両を db-context に追加します。

//if there is no such a Vehicle in system, add it:
if (vehicle.Name !=null && vehicle.Name != String.Empty && _dbContext.Where(v => v.Name == vehicle.Name).FirstOrDefault() == null)
    _dbContext.Add(vehicle);

_dbContext.SaveChanges();
于 2015-08-27T16:26:13.323 に答える
0

実際には、これには簡単な解決策があります。

  • 現在のように、テーブル作成スクリプトの値を使用してデフォルトの制約を残す必要があります。

    CREATE TABLE Vehicle (
      VehicleId  int identity(1,1) not null,
      Name varchar(100) not null default ('Not Set')
    )
    
  • DatabaseGeneratedクラス定義のプロパティから属性を削除するだけです:

    public class Vehicle {
       ...
    
       [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
       public string ShoulderYN { get; set; }
    }
    

それだけです。コードで値を指定しない場合にのみ、データベースはデフォルト値を使用します。お役に立てれば。

于 2015-11-02T11:47:20.517 に答える