Table<TEntity>.Attach メソッド

定義

エンティティを DataContextにアタッチします。

オーバーロード

名前 説明
Attach(TEntity)

オプティミスティック コンカレンシー チェックに元の値が必要な場合に、切断されたエンティティまたは "デタッチされた" エンティティを新しい DataContext にアタッチします。

Attach(TEntity, Boolean)

エンティティを変更済みまたは変更されていない状態で DataContext にアタッチします。

Attach(TEntity, TEntity)

エンティティと元の状態の両方を指定して、変更または変更されていない状態でエンティティを DataContext にアタッチします。

注釈

Attach メソッドは、1 つのDataContextで作成され、クライアントにシリアル化された後、逆シリアル化されたエンティティと共に使用されます (更新または削除操作を実行する目的で)。 詳細については、「 N 層アプリケーションでのデータ取得と CUD 操作 (LINQ to SQL)」を参照してください。

シリアル化によってデタッチされていないエンティティを Attach しないでください。 シリアル化されていないエンティティでは、遅延ローダーとの関連付けが維持され、2 番目のデータ コンテキストによってエンティティが追跡された場合に予期しない結果が発生する可能性があります。

新しいエンティティがアタッチされると、すべての子コレクション (たとえば、関連付けられているテーブルからエンティティのコレクション EntitySet ) の遅延ローダーが初期化されます。 SubmitChangesが呼び出されると、子コレクションのメンバーはUnmodified状態になります。 子コレクションのメンバーを更新するには、 Attach を明示的に呼び出し、そのエンティティを指定する必要があります。

Attach は、指定されたオブジェクトのオブジェクト グラフ内のすべてのエンティティをアタッチします。 例えば次が挙げられます。

using (var db = new SampleDataContext())
{
    var employee = new Employee { employeeId = 1 };

    var master = new Master();
    master.Employee = employee;

    var child = new Child();
    child.Employee = employee;

    db.Employees.Attach(employee);

    master.Child = child;

    db.Masters.InsertOnSubmit(master);

    db.SubmitChanges();
}
Using db As New SampleDataContext()
    Dim employee As New Employee With { .employeeId = 1 }

    Dim master As New Master()
    master.Employee = employee

    Dim child As New Child()
    child.Employee = employee

    db.Employees.Attach(employee)

    master.Child = child

    db.Masters.InsertOnSubmit(master)

    db.SubmitChanges()

End Using

AttachEmployeeを呼び出すと、Employeeにはマスターと子の両方との関係があるため、従業員、マスター、および子がアタッチされます。 状態を attached から inserted に変更するには、 InsertOnSubmit を明示的に呼び出す必要があります。

Attach(TEntity)

オプティミスティック コンカレンシー チェックに元の値が必要な場合に、切断されたエンティティまたは "デタッチされた" エンティティを新しい DataContext にアタッチします。

public:
 void Attach(TEntity entity);
public:
 virtual void Attach(TEntity entity);
public void Attach(TEntity entity);
member this.Attach : 'Entity -> unit
abstract member Attach : 'Entity -> unit
override this.Attach : 'Entity -> unit
Public Sub Attach (entity As TEntity)

パラメーター

entity
TEntity

アタッチするエンティティの元の値。

実装

注釈

Attach メソッドは、1 つのDataContextで作成され、クライアントにシリアル化された後、逆シリアル化されたエンティティと共に使用して、更新または削除操作を実行します。 新しい DataContext には、切断されたエンティティの元の値を追跡する方法がないため、クライアントはそれらの値を指定する必要があります。 このバージョンの Attachでは、エンティティは元の値の状態であると見なされます。 このメソッドを呼び出した後、クライアントから送信された追加データなど、そのフィールドを更新できます。

新しいエンティティがアタッチされると、すべての子コレクション (たとえば、関連付けられているテーブルからエンティティのコレクション EntitySet ) の遅延ローダーが初期化されます。 SubmitChangesが呼び出されると、子コレクションのメンバーはUnmodified状態になります。 子コレクションのメンバーを更新するには、 Attach を明示的に呼び出し、そのエンティティを指定する必要があります。

詳細については、「 N 層アプリケーションでのデータ取得と CUD 操作 (LINQ to SQL)」を参照してください。

シリアル化によってデタッチされていないエンティティを Attach しないでください。 シリアル化されていないエンティティでは、遅延ローダーとの関連付けが維持され、2 番目のデータ コンテキストによってエンティティが追跡された場合に予期しない結果が発生する可能性があります。

適用対象

Attach(TEntity, Boolean)

エンティティを変更済みまたは変更されていない状態で DataContext にアタッチします。

public:
 void Attach(TEntity entity, bool asModified);
public void Attach(TEntity entity, bool asModified);
member this.Attach : 'Entity * bool -> unit
Public Sub Attach (entity As TEntity, asModified As Boolean)

パラメーター

entity
TEntity

アタッチするエンティティ。

asModified
Boolean

true エンティティを変更済みとしてアタッチする場合。エンティティを変更されていない状態でアタッチする false

注釈

変更済みとしてアタッチする場合、エンティティはバージョン メンバーを宣言するか、更新の競合チェックに参加しないようにする必要があります。 新しいエンティティがアタッチされると、すべての子コレクション (たとえば、関連付けられているテーブルからエンティティのコレクション EntitySet ) の遅延ローダーが初期化されます。 SubmitChangesが呼び出されると、子コレクションのメンバーはUnmodified状態になります。 子コレクションのメンバーを更新するには、 Attach を明示的に呼び出し、そのエンティティを指定する必要があります。

適用対象

Attach(TEntity, TEntity)

エンティティと元の状態の両方を指定して、変更または変更されていない状態でエンティティを DataContext にアタッチします。

public:
 void Attach(TEntity entity, TEntity original);
public void Attach(TEntity entity, TEntity original);
member this.Attach : 'Entity * 'Entity -> unit
Public Sub Attach (entity As TEntity, original As TEntity)

パラメーター

entity
TEntity

アタッチするエンティティ。

original
TEntity

元の値を含むデータ メンバーを持つ同じエンティティ型のインスタンス。

using (Northwnd db2 = new Northwnd(@"c:\northwnd.mdf"))
{
    Customer Cust_File = new Customer();
    string xmlFile = "";

    // Get the original object from the deserializer.
    Customer c = SerializeHelper.Deserialize<Customer>
        (xmlFile, Cust_File);

    // Set all the desired properties to the entity to be attached.
    Customer c_updated = new Customer() { CustomerID = c.CustomerID,
        Phone = "425-123-4567", CompanyName = "Microsoft" };
    db2.Customers.Attach(c_updated, c);

    // Perform last minute updates, which will still take effect.
    c_updated.Phone = "425-765-4321";

    // SubmitChanges()sets the phoneNumber and CompanyName of
    // customer with customerID=Cust. to "425-765-4321" and
    // "Microsoft" respectively.
    db2.SubmitChanges();
}
Using db = New Northwnd("...")
    Dim Cust_File As New Customer()
    Dim xmlFile As String = ""

    'Get the original object from the deserializer.
    Dim c As Customer = SerializeHelper.Deserialize(Of Customer)(xmlFile, Cust_File)

    ' Set all the desired properties to the entity to be attached.
    Dim c_updated As New Customer With {.CustomerID = c.CustomerID, _
    .Phone = "425-123-4567", .CompanyName = "Microsoft"}
    db.Customers.Attach(c_updated, c)

    ' Perform last minute updates, which will still take effect. 
    c_updated.Phone = "425-765-4321"

    ' SubmitChanges()sets the phoneNumber and CompanyName of
    ' customer with customerID=Cust. to "425-765-4321" and
    ' "Microsoft" respectively.
    db.SubmitChanges()
End Using

注釈

次の例では、 Customer オブジェクトは既に正しく構成されています。 更新プログラムを再生しなくても、 Attach を呼び出すことができます。

新しいエンティティがアタッチされると、すべての子コレクション (たとえば、関連付けられているテーブルからエンティティのコレクション EntitySet ) の遅延ローダーが初期化されます。 SubmitChangesが呼び出されると、子コレクションのメンバーはUnmodified状態になります。 子コレクションのメンバーを更新するには、 Attach を明示的に呼び出し、そのエンティティを指定する必要があります。

適用対象