- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们的数据库中有一个审计表,在更新时,旧值和新值被序列化为 XML 并存储在同一行中。这些对象目前是深度克隆的:
public EntityObject CloneEntity(EntityObject obj)
{
DataContractSerializer dcSer = new DataContractSerializer(obj.GetType());
MemoryStream memoryStream = new MemoryStream();
dcSer.WriteObject(memoryStream, obj);
memoryStream.Position = 0;
EntityObject newObject = (EntityObject)dcSer.ReadObject(memoryStream);
return newObject;
}
虽然这有效,但由于从深度克隆中提取的相关记录,它会生成大量数据,从 dcSer.WriteObject(memoryStream, obj)
上的数据库读取了数十万次,最终的 MemoryStream 大小约为 200MB,更不用说写回数据库的数据量了。不理想。
所以我想改为执行成员克隆,因为我的理解是成员克隆会忽略对象引用,并避免复制所有相关的 Entity Framework 模型。
所以我这样做了:
public EntityObject CloneEntity(EntityObject obj)
{
EntityObjectAuditable auditable = (EntityObjectAuditable)obj; // invalid cast exception
return auditable.ShallowCopy();
}
// ....
public class EntityObjectAuditable : EntityObject
{
public EntityObjectAuditable ShallowCopy()
{
return (EntityObjectAuditable)this.MemberwiseClone();
}
}
但我得到一个无效的转换异常,因为传入的 EntityObject
的实际类型是与表本身相关的子类。
我也尝试过使用扩展方法访问 MemberwiseClone()
,但是扩展方法无法访问 protected 方法。
那么,如何创建通用 EntityObject 的浅拷贝?
最佳答案
我的第一个建议是尝试这个,这与您现在正在做的类似,但对我来说开销很小:
DataContractSerializationUtils.SerializeToXmlString(Entity, throwExceptions);
另外,我以前成功地使用过这种方法,并且没有发现输出太冗长。它似乎与您现在所做的几乎相同。
/// <summary>
/// Creates an exact duplicate of the entity provided
/// </summary>
/// <param name="source">The source copy of the entity</param>
/// <returns>An exact duplicate entity</returns>
public TEntity Clone(TEntity Source)
{
// Don’t serialize a null object, simply return the default for that object
if (ReferenceEquals(Source, null))
{
return default(TEntity);
}
var dcs = new DataContractSerializer(typeof (TEntity));
using (Stream stream = new MemoryStream())
{
dcs.WriteObject(stream, Source);
stream.Seek(0, SeekOrigin.Begin);
return (TEntity) dcs.ReadObject(stream);
}
}
如果这些选项都不吸引人,我的建议是编写一个简短的函数,使用反射从源实体复制任何属性。
关于c# - 创建 EntityObject 子类的浅拷贝/克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9695420/
我想对我的 ObjectContext 执行删除操作。 这是我的代码: var tempList = someEntityObject.SomeCollectionOfEntityObject; fo
我刚得到一个要使用的 DLL 库,其中记录了以下类: 类定义: [SerializableAttribute] [EdmEntityTypeAttribute(NamespaceName = "Cus
我不确定这个问题的确切技术规范,但简单来说,我正在尝试创建一个包装器/扩展方法来保存我的实体。 所以我将新的实体数据模型 (.edmx) 文件添加到我的项目中。像这样生成 DbSet- public
我在我的应用程序中使用 EntityFramework、WPF 和 MVVM,并且在更新 EntityObjects 之间关系的数据绑定(bind)时遇到了一些问题。我能够将我的问题缩小到只有几行 X
我是 Entity Framework 的新手(我使用的是 EF5),我正在从事一个测试项目以了解一些相关知识。 现在我正在实现一些 DAO 类来访问 this tutorial 之后的数据库(有点老
我们的数据库中有一个审计表,在更新时,旧值和新值被序列化为 XML 并存储在同一行中。这些对象目前是深度克隆的: public EntityObject CloneEntity(EntityObjec
我正在使用 .Net Connector 6.3.6 处理 MySQL,并在 VS 2010 上创建实体模型。我打算编写一个通用方法,将 EntityObject 添加到其对应的表中。这是它的样子:
众所周知,如果我们有一个 EntityObject,则无法找到它所属的 ObjectContext。我想这很公平,但为什么我们可以延迟加载对象呢?延迟加载的过程肯定必须访问 ObjectContext
我想阅读 EntityObject 中的更改以纳入报告。 例如: Name: Before After Location: Before After 有没有通用的方法来做到这一点?我将 EF4 与默认
我正在使用 Entity Framework 5 构建我的第一个 MVC 4/Razor 网络应用程序,并在做出任何设计决定之前做了一些功课。 我看到 EF 对象来自 EntityObject ,它似
我的 Entity Framework 模型是从 SQL Server 数据库生成的。由于我需要从 Silverlight 访问数据库,因此我针对 EF 模型为 RIAServices 生成了一个 D
我有一个从 Entity Framework 对象生成的 XML 文档。生成的 XML 如下所示: 转发完整的 XML Editorial_MasterEntities
我们正在尝试转换 IQueryable 的实例到 IQueryable , SpecificEntityObject类型仅在运行时已知。 我们已尝试使用下面的代码,该代码无法编译,因为类型或命名空间
我正在尝试缩短长代码。原始代码执行以下操作: using (var context = new DataEntities()) { context.Table1.Foreach(x =>{ /
我一直在查看许多使用 EntityFramework 的 WCF 示例,其中大多数似乎将某种 POCO 或 DTO 类返回给客户端。 我想知道为什么这是因为默认 EntityObject包括 [Dat
我已经在 VS2015 中安装了最新的 Entity Framework 版本 (EntityFramework.6.1.3)。我在项目中添加了 EF 并删除了 2 个 .tt 文件(edmx_fil
假设我在数据库中有一行我知道一个特定的 id(在我下面的示例中 - 一个 Id = 5 的符号),我可以创建一个 EntityObject 可以附加到另一个实体而无需加载它来自数据库(同样的场景也适用
是否有一种简单的方法来比较两个 EntityObjects 的值相等。 我只是想检查所有数据库值是否相同,所以我不在乎 EntityKey 是否不同。 这可能是内置的吗?或者我应该写我自己的方法。 我
我正在为我的模型层使用 Entity Framework ,我想连接一个 PropertyChanged 事件,该事件根据属性的 OldValue 和 NewValue 更改另一个属性。有没有我可以为
除了更快的开发时间(据我所知,Visual Studio 2010 beta 2 没有用于构建 POCO 实体对象的 T4 模板),默认情况下,使用 Entity Framework 创建的传统 En
我是一名优秀的程序员,十分优秀!