1

LINQ to SQL を使用していくつかのクラスを生成しました

それらの1つは「顧客」です

ここで、切断された Customer オブジェクトを作成したいと考えています。

つまり、オブジェクトを作成してセッションに保持し、必要な場合にのみアタッチすることができます。自動的ではありません。したがって、それを添付した場合にのみ、コンテキストの SubmitChange() に影響するはずです。

これは可能ですか?

また、SubmitChanges() に影響を与えることなく、この切り離されたオブジェクトを添付オブジェクトのコレクションに追加できますか?

4

3 に答える 3

1

「デタッチ」メソッドはありませんが、シリアライゼーションで可能です:

Customer customerCopy;
BinaryFormatter bf = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
    bf.Serialize(ms, customer);
    ms.Position = 0;
    customerCopy = (Customer)bf.Deserialize(ms);
}

後でオブジェクトを再アタッチするのは面倒なので注意してください。Attachテーブル メソッドは扱いにくいです。通常、エンティティを機能させるには、エンティティに (タイムスタンプ タイプの) 列が必要ですVersion

注 - 質問を読み直したところ、オブジェクトを構築したいだけのように聞こえます。その場合、新しいCustomerビアを構築しても、接続されたエンティティは作成new Customer()されません。InsertOnSubmitテーブルでorAttachメソッドを呼び出した後にのみアタッチされます。

また、分離されたエンティティを、添付されたエンティティを含む (または類似の) エンティティに自由に追加できますList<Customer>。Linq to SQL はこれを気にしません。エンティティは、DataContextそれ自体によって分配されるか、上記のいずれかの方法を使用して添付された場合にのみ添付されます。

于 2010-02-10T01:12:10.003 に答える
0

Linq to Sql では、DataContractSerializer のみがサポートされています。

Detach() には、より効率的な方法があり、次の基本メソッドを使用しています。

public void Detach()
{
   GetType().GetMethod("Initialize", BindingFlags.Instance |         
      BindingFlags.NonPublic).Invoke(this, null);
}

これにより、すべての FK プロパティを「リセット」する Initialize() メソッドが呼び出されます。秘訣は、このメソッドはシリアライゼーションがオンになっている場合にのみ生成されることです。これを回避する方法があります。詳細については、こちらをご覧ください

于 2010-07-30T08:54:26.300 に答える
0

Vitaliy、申し訳ありませんが、そのブログ投稿を失いました。それでもコードは持っています。

public class EntityBase : IEntityBase
{
    /// <summary>
    /// Detaches the entity, so it can be added to another dataContext. It does this by setting
    /// all the FK properties to null/default.
    /// </summary>
    public void Detach()
    {
        // I modified the .tt file to generate the Initialize method by default. 
        // The call to OnCreated() is moved to the constructor.
        GetType().GetMethod("Initialize", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(this, null);
    }
}

そして、これが私のアダプターからの Detach() への呼び出しです

public class OrderAdapter : IOrderAdapter
{
    public void Add(IOrder order)
    {
        try
        {
            using (var db = new ATPDataContext())
            {
                Order newOrder = (Order)order;
                newOrder.Detach(); // not required for insertion, but to keep references to Product 
                db.Orders.InsertOnSubmit(newOrder);
                db.SubmitChanges();
            }
        }
        catch (Exception ex)
        {                
        }
    }
 }

そして、私の .tt ファイルで

#region Construction
public <#=class1.Name#>()
{
    Initialize();

    <# if (class1.HasPrimaryKey) {#>
        OnCreated();
    <# } #>
}

private void Initialize()
{
<#        foreach(Association association in class1.Associations) { #>
        <#=association.Storage#> = <#
        if (association.IsMany) {
            #>new EntitySet<<#=association.Type.Name#>>(attach_<#=association.Member#>, detach_<#=association.Member#>);
<#          } else {
            #>default(EntityRef<<#=association.Type.Name#>>); 
<#          }
    }
#>
    }
#endregion

チッ!

于 2012-07-13T10:34:28.750 に答える