3

私は EF 4.3.1 を使用しています。保存時にエンティティのデフォルト値を追加する必要があります。

現時点では SaveChanges() を使用していますが、動作します。

使用するコードからわかるように、特定の DataTypeChangeTracker.Entries<Option>()Optionrappresent します。

可能かどうか、および ChangeTracker.Entries のより一般的なバージョンを作成ChangeTracker.Entries<t>()して、モデル内のすべてのタイプのエンティティをチェックできるようにする方法を知りたいです。私の特定のケースでわかるように、多くのクラスに NoteInternal プロパティがあります。

      public override int SaveChanges()
    {
        #region Option BL
        var entities = ChangeTracker.Entries<Option>()
                                    .Where(e => e.State == EntityState.Added ||
                                                e.State == EntityState.Modified)
                                    .Select(e => e.Entity);
        // Add Default values when Creating or Editing an Entity
        string defaultvalue = "";
        foreach (var entity in entities)
        {
            if (String.IsNullOrWhiteSpace(entity.NoteInternal))
                entity.NoteInternal = defaultvalue;
        }
        #endregion

        return base.SaveChanges();
    }

ご協力いただきありがとうございます!

PS: ここで DYNAMIC データ型を使用する意味はありますか?

4

2 に答える 2

4

次の 3 つのオプションが考えられます。

  1. リフレクションを使用して、各アイテムにNoteInternalプロパティがあるかどうかを確認します。これは遅いです。
  2. 各アイテムのプロパティdynamicへのアクセスを試みるために使用します。NotIntenralエンティティにプロパティがない場合にスローされる例外を確認して処理する必要があります。
  3. プロパティを定義するインターフェイスIHasNoteInternalを作成し、プロパティを持つすべてのエンティティがそのインターフェイスを実装するようにします。次に、タイプのすべてのエントリを取得しますIHasNoteInternal

3. オプションが最適で、最適な設計が得られると思いますが、エンティティを変更する必要があり、それが可能かどうかは不明です。ジェネリック メソッドを使用して変更されたエンティティを取得できるかどうかはわかりませんEntries<TEntity>()。インターフェイスに基づいてエンティティを照合できない可能性があります。その場合、非ジェネリックEntries()を使用し、linq のOfType<T>()演算子を使用して関連するエントリを除外します。

var hasNotInternal = ChangeTracker.Entries()
                     .Select(e => e.Entity).OfType<IHasNotInternal>();
于 2012-07-04T08:39:07.520 に答える
1

NoteInternal プロパティを実装するインターフェイスからエントリを継承させます。

拡張クラスを作成する

public static class DbChangeTrackerExtensions {
public static IEnumerable<T> TypedEntries<T>(this DbChangeTracker tracker) {
  return tracker.Entries().OfType<T>();
}

次に、このインターフェイスを渡して呼び出すことができます。

または、エンティティを変更できない場合

var name="NoteInternal";

var entities = ChangeTracker.Entries()  
                                .Where(e => e.State == EntityState.Added ||  
                                            e.State == EntityState.Modified)  
                                .Where(e => e.CurrentValues.Any(c=>c.Name==name && string.IsNullOrWhiteSpace((string)c.CurrentValue)));  
    // Add Default values when Creating or Editing an Entity  
    string defaultvalue = "";  
    foreach (var entity in entities)  
    {  
       entity.Property(name).CurrentValue=defaultvalue;
    }  
于 2012-07-04T08:40:00.417 に答える