1


0

新しく作成された分離されたエンティティからエンティティを更新する方法

このような新しい製品を作成したとしましょう:

Product p=new Product(){ Id= 2,Name="some name"};

製品変数がデータコンテキストに関連付けられたことはありませんが、Id = 2のデータベース内の既存の製品が分離された製品の名前で更新されるように、このエンティティを添付するにはどうすればよいですか?

3 Answer


0


同様のものが機能することを願っています

 Datacontext db = new Datacontext(); // replace with your DataContext
 Product originalProduct =
         db.Products.Single(p => p.Id == 2); // get product with Id 2

 originalProduct.Name = "SomeName";  // only reset Name prop
 originalProduct = p;                // or you may assign p to originalProduct
 db.SubmitChanges();                 // submit changes to DB


0


少し簡単な解決策は、そのように動作させたいエンティティに「ICloneable」インターフェースを実装することです。 次に、Clone()を呼び出して、DBから取得した「元の」エンティティを呼び出します。

例:

class Product : ICloneable
{
    public virtual int Id { get; private set; }
    public virtual string Name { get; set; }

    public object Clone()
    {
        return new Product() { Id=this.Id, Name=this.Name };
    }
}

そして、あなたがする必要があるのは:

Datacontext db = new Datacontext(); // replace with your DataContext
Product originalProduct =
        db.Products.Single(p => p.Id == 2); // get product with Id 2

db.originalProduct = p.Clone()
db.SubmitChanges();

*編集:*私は職場で同じ問題に遭遇しましたが、これまでに見つけた最もエレガントな解決策は、新しく作成されたエンティティ、あなたの場合は「Product」を受け取り、そのプロパティをコピーする拡張メソッドを構築することでした(識別子を除く)DataContextから取得したエンティティに。

このようにして、すべてのプロパティをReflection経由でコピーしました。エンティティを更新しても、拡張メソッドは引き続き機能します。

これがあなたにも役立つことを願っています。

この問題に対するよりエレガントな解決策を見つけた場合、私は聞きたいです:)


0


gillybの投稿と私がそこに残したコメントに追加するだけです。 エンティティのクローンを作成する非常に簡単な方法は次のとおりです。

Private Function CloneEntity(Of TEntity)(ByVal entity As TEntity) As TEntity

    Dim dataContext As New DataContext()
    Dim entityType As System.Type = GetType(TEntity)

    ' If the purpose of the clone is just to attach it the existing entity to a new
    ' DataContext, you can use IdentityMembers in place of PersistantDataMembers. Setting
    ' only the IdentityMembers is enough to allow for attaching the clone as an "originaL"
    ' entity to the DataContext.
    Dim dataMembers = dataContext.Mapping.GetTable(entityType).RowType.PersistentDataMembers

    Dim clone As TEntity ' Do something here to create an entity of the desired type.
    Dim boxedClone As Object = clone

    For Each dm In dataMembers

         ' Depending on how your ColumnAttribute is set, you would use StorageAccessor if
         ' the Storage property is set. Otherwise, you would use MemberAccessor instead.
          dm.StorageAccessor.SetBoxedValue(boxedClone, dm.StorageAccessor.GetBoxedValue(entity))
    Next

    Return clone

End Function

次に、これを行う必要があります:

Dim dataContext As New DataContext()
dataContext.GetTable(Of Object)().Attach(entityToUpdate, CloneEntity(entityToUpdate))
dataContext.SubmitChanges()