我想补充一个方法需要可复制这样每个模型,我推荐一个接口也。
这是可以做到这样的事:
//Company.cs
Company DeepClone()
{
Company clone = new Company();
clone.Name = this.name;
//...more properties (be careful when copying reference types)
clone.Locations = new List<Location>(this.Locations.Select(l => l.DeepClone()));
return clone;
}
你应该重复这个基本模式为每级和“孩子”类必须是可复制的。通过这种方式,每个对象都知道如何创建自身的深层克隆,并将子对象的责任传递给子类,整齐地封装所有内容。
它可以这样使用:
Company copyOfCompany123 = DbContext.Companies.Find(123).DeepClone;
我道歉,如果在上面的代码中的任何错误;目前我没有Visual Studio来验证所有内容,我正在从内存中工作。
另外一个非常简单和代码有效的方式来使用序列深克隆对象可以在这个帖子中找到How do you do a deep copy an object in .Net (C# specifically)?
public static T DeepClone<T>(T obj)
{
using (var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
ms.Position = 0;
return (T) formatter.Deserialize(ms);
}
}
要知道,这可能有一些非常严重的资源和性能问题取决于你的对象结构。每个想要使用它的课程也必须标注[Serializable]
属性。
我使用的UnitOfWork,我怎么能脱离正确? http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns- in-an-asp-net-mvc-application –
你不*有*使用它。不要让你自己的建筑扼杀你。这个通用的存储库使得使用EF的功能变得非常困难。如果你想要如何使用'AsNoTracking'? –
但是现在怎么不能重构一切。我必须改变一切,那么对吗? –