1

誰でもこれを行うためのより簡単で自動的な方法を提供できますか?

FilterComboTemplate モデルには次の保存メソッドがあります。データは、webapi によって json から ac# モデル エンティティに変換されています。

そのため、DeviceProperty テーブルに重複するエントリを作成しないため、各フィルターを順番に調べて、コンテキストから割り当てられた DeviceFilterProperty を取得し、フィルター内のオブジェクトをオーバーライドする必要があります。以下のコードを参照してください。

既に存在する場合はすべてのオブジェクト Id を持っているので、これは自動的に処理されるべきだと思われますが、おそらくそれは単なる希望的観測です。

public void Save(FilterComboTemplate comboTemplate)
{
    // Set the Device Properties so we don't create dupes
    foreach (var filter in comboTemplate.Filters)
    {
        filter.DeviceProperty = context.DeviceFilterProperties.Find(filter.DeviceFilterProperty.DeviceFilterPropertyId); 
    }

    context.FilterComboTemplates.Add(comboTemplate);
    context.SaveChanges();
}

ここから、フィルターが存在するかどうかを確認し、データベース内のものと異なる場合は手動で更新して、FilterComboTemplate の編集後にまったく新しいセットを作成し続けないようにする必要があります。

私はこのタイプのコードをたくさん書いていることに気づきました。ちょっとした文脈のために、以下に他のモデルクラスを含めました。

public class FilterComboTemplate
{
    public FilterComboTemplate()
    {
        Filters = new Collection<Filter>();
    }

    [Key]
    public int FilterComboTemplateId { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public ICollection<Filter> Filters { get; set; }
}

public class Filter
{
    [Key]
    public int FilterId { get; set; }

    [Required]
    public DeviceFilterProperty DeviceFilterProperty { get; set; }

    [Required]
    public bool Exclude { get; set; }

    [Required]
    public string Data1 { get; set; }
}

public class DeviceFilterProperty
{
    [Key]
    public int DeviceFilterPropertyId { get; set; }

    [Required]
    public string Name { get; set; }
}
4

2 に答える 2

0

SOに関するいくつかの 同様の 質問から判断すると、EFが自動的に行うことはないようです...

おそらくコードの大幅な削減ではありませんが、DbContext (または特定の dataContext) の拡張メソッドである次のようなことができます。

public static bool Exists<TEntity>(this MyDataContext context, int id) 
{
    // your code here, something similar to
    return context.Set<TEntity>().Any(x => x.Id == id);
    // or with reflection:
    return context.Set<TEntity>().Any(x => {
        var props = typeof(TEntity).GetProperties();
        var myProp = props.First(y => y.GetCustomAttributes(typeof(Key), true).length > 0)
        var objectId = myProp.GetValue(x)
        return objectId == id;
    });
}

これにより、そのキーを持つオブジェクトが DbContext に存在するかどうかがチェックされます。当然、同様のメソッドを作成して、実際にそのエンティティを返すこともできます。

コードには 2 つの「戻り値」があります。好きな方を使用してください。前者は、すべてのエンティティが Id プロパティを持つ「エンティティ」オブジェクトから継承するように強制します (これは必ずしも悪いことではありませんが、これには苦労が見られます... TEntity パラメータも強制する必要があります。where TEntity : Entityまたは類似)。ひとつまみの塩で「リフレクション」ソリューションを使用してください。まず第一に、パフォーマンスに問題がある可能性があります。第二に、現在VSを実行していないため、正常にコンパイルされるかどうかさえわかりません。 !

それがうまくいくかどうか教えてください:)

于 2012-10-17T12:53:15.470 に答える
0

リクエストからバインドされた後、パラメーターに対していくつかの一般的な操作があるようです。

コードを再利用するために、カスタム パラメーター バインディングを作成することを検討してください。HongMei のブログは良い出発点です: http://blogs.msdn.com/b/hongmeig1/archive/2012/09/28/how-to-customize-parameter-binding.aspx

シナリオ 2 のコードを使用して、本体からモデルを逆シリアル化し、その後必要な操作を実行するためのフォーマッタ バインディングを取得できます。

ブログの最後の手順を参照して、カスタマイズするパラメーターの型を指定してください。

于 2012-10-11T19:55:43.193 に答える