我使用 LINQ to SQL 生成了几个类
其中之一是“客户”
现在我想创建一个断开连接的客户对象。
即,我可以创建对象将其保持在会话中,然后仅在我愿意时将其附加回来。不是自动的。因此,只有当我附加它时 - 它应该影响我的上下文的 SubmitChange() 否则不会。
这可能吗?
我也可以将此分离的对象添加到附加对象的集合中而不影响 SubmitChanges() 或添加时分离的对象会再次附加吗?
我使用 LINQ to SQL 生成了几个类
其中之一是“客户”
现在我想创建一个断开连接的客户对象。
即,我可以创建对象将其保持在会话中,然后仅在我愿意时将其附加回来。不是自动的。因此,只有当我附加它时 - 它应该影响我的上下文的 SubmitChange() 否则不会。
这可能吗?
我也可以将此分离的对象添加到附加对象的集合中而不影响 SubmitChanges() 或添加时分离的对象会再次附加吗?
没有“分离”方法,但可以通过序列化:
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()
将不会创建一个附加的实体。只有在您调用table 上的InsertOnSubmit
or方法后,它才会被附加。Attach
此外,您可以自由地将分离的实体添加到List<Customer>
包含附加实体的(或类似的)实体中——Linq to SQL 不关心这一点,实体只有在它DataContext
自己分配或使用上述方法之一附加时才会被附加。
对于 Linq to Sql,仅支持 DataContractSerializer。
Detach() 有一种更高效的方法,它使用以下基本方法:
public void Detach()
{
GetType().GetMethod("Initialize", BindingFlags.Instance |
BindingFlags.NonPublic).Invoke(this, null);
}
这将调用 Initialize() 方法,该方法将“重置”所有 FK 属性。诀窍是这个方法只在序列化打开时生成。有一种方法可以解决这个问题,查看这里了解更多信息
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
!