1

我使用 LINQ to SQL 生成了几个类

其中之一是“客户”

现在我想创建一个断开连接的客户对象。

即,我可以创建对象将其保持在会话中,然后仅在我愿意时将其附加回来。不是自动的。因此,只有当我附加它时 - 它应该影响我的上下文的 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时间戳类型)列才能使其工作。

注意-我只是重读了您的问题,听起来好像您只是想构造对象。如果是这样,构建一个新的过Customernew Customer()不会创建一个附加的实体。只有在您调用table 上的InsertOnSubmitor方法后,它才会被附加。Attach

此外,您可以自由地将分离的实体添加到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);
}

这将调用 Initialize() 方法,该方法将“重置”所有 FK 属性。诀窍是这个方法只在序列化打开时生成。有一种方法可以解决这个问题,查看这里了解更多信息

于 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 回答