gpt4 book ai didi

.net - 重复 LINQ to SQL 实体/记录?

转载 作者:行者123 更新时间:2023-12-05 01:20:28 26 4
gpt4 key购买 nike

复制 [克隆] LINQ to SQL 实体从而在数据库中生成新记录的最佳实践是什么?

上下文是我希望为管理员网格中的记录创建一个重复的函数。网站并在尝试了一些显而易见的事情后,读取数据,更改 ID=0,更改名称,submitChanges() ,并遇到异常,大声笑。我想我可能会停下来问问专家。

我希望首先阅读记录,通过添加前缀“Copy Of”来更改名称,然后另存为新记录。

最佳答案

创建一个新实例,然后使用 linq 映射类和反射来复制成员值。

例如

public static void CopyDataMembers(this DataContext dc,
object sourceEntity,
object targetEntity)
{
//get entity members
IEnumerable<MetaDataMember> dataMembers =
from mem in dc.Mapping.GetTable(sourceEntity.GetType())
.RowType.DataMembers
where mem.IsAssociation == false
select mem;

//go through the list of members and compare values
foreach (MetaDataMember mem in dataMembers)
{
object originalValue = mem.StorageAccessor.GetBoxedValue(targetEntity);
object newValue = mem.StorageAccessor.GetBoxedValue(sourceEntity);

//check if the value has changed
if (newValue == null && originalValue != null
|| newValue != null && !newValue.Equals(originalValue))
{
//use reflection to update the target
System.Reflection.PropertyInfo propInfo =
targetEntity.GetType().GetProperty(mem.Name);

propInfo.SetValue(targetEntity,
propInfo.GetValue(sourceEntity, null),
null);

// setboxedvalue bypasses change tracking - otherwise
// mem.StorageAccessor.SetBoxedValue(ref targetEntity, newValue);
// could be used instead of reflection
}
}
}

...或者您可以使用 DataContractSerializer 克隆它:
internal static T CloneEntity<T>(T originalEntity) where T : someentitybaseclass
{
Type entityType = typeof(T);

DataContractSerializer ser =
new DataContractSerializer(entityType);

using (MemoryStream ms = new MemoryStream())
{
ser.WriteObject(ms, originalEntity);
ms.Position = 0;
return (T)ser.ReadObject(ms);
}
}

关于.net - 重复 LINQ to SQL 实体/记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/637535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com