1

私のモデルエンティティフレームワーク:

public partial class T02
{
    public long ID { get; set; }
    public int F01 { get; set; }
}

表:T02

------------------------
id[Key,identity]      F01
------------------------
1       a
2       b

================================================== == ボタンがあります > コード

    public void Button_Click(object Sender, EventArgs e)
    {
        T02 T1 = new T02 { ID = 1, F01 = "x" };
        T02 T2 = new T02 { ID = 2, F01 = "y" };
        T02 T3 = new T02 { ID = 0, F01 = "g" };
        T02 T4 = new T02 { ID = 0, F01 = "h" };

        // How ID > 1 2 Update in Table & 
        // because not in table, > g , h > automatic add to Table 
        // ???
    }

私の問題は次のとおりです。私はオンタイム更新ではなく、T02.IDがテーブルにない場合は自動的に追加されます..

IDなしでテーブルレコードに追加し、ID付きでレコードを更新することは可能ですか?

私は c#.NET 4.5 で作業しました。ありがとう

4

1 に答える 1

0

Contextこのメソッドをクラスに追加します。

protected virtual void InsertOrUpdate<T>(T entity, long id)
{
    if (id == default(int))
        this.Set<T>().Add(entity);
    else
        this.Entry(entity).State = EntityState.Modified;
}

次のように使用できます。

public void Button_Click(object Sender, EventArgs e)
{
    T02 T1 = new T02 { ID = 1, F01 = "x" };
    T02 T2 = new T02 { ID = 2, F01 = "y" };
    T02 T3 = new T02 { ID = 0, F01 = "g" };
    T02 T4 = new T02 { ID = 0, F01 = "h" };

    using(var context = new MyDbContext())
    {
        context.InsertOrUpdate(T1, T1.ID);
        context.InsertOrUpdate(T2, T2.ID);
        context.InsertOrUpdate(T3, T3.ID);
        context.InsertOrUpdate(T4, T4.ID);
    }
}

これが機能したら、メソッドIDに渡す必要がなくなるように、プロパティを公開するすべての POCO クラスに標準インターフェイスを実装することを検討できます。ID

public interface IId
{
    long ID { get; }
}

public partial class T02 : IId
{
    public long ID { get; set; }
    public int F01 { get; set; }
}

これにより、より適切な方法が得られますContext

protected virtual void InsertOrUpdate<T>(T entity) where T : IId
{
    if (entity.ID == default(int))
        this.Set<T>().Add(entity);
    else
        this.Entry(entity).State = EntityState.Modified;
}
于 2013-09-03T09:53:02.827 に答える