Tag: 延迟加载

entity framework延迟加载的私有支持字段

我正在使用启用了延迟加载的Entity Framework 5。 我有以下代码: private ICollection _subscriptions = new Collection(); public virtual ICollection Subscriptions { get { return _subscriptions; } set { _subscriptions = value; } } 但这有意义吗? 我想确保公共属性Subscriptions永远不为null。 由于虚拟entity framework会覆盖getter和setter以提供延迟加载function。 我是否需要此字段,或者我可以只使用自动属性,如果没有订阅,我会得到一个空列表?

虚拟属性和延迟加载

根据定义,虚拟属性或方法是要被覆盖的子类可见的方法。 但是,例如NHibernate使用虚拟属性来确保延迟加载。 我的问题不是关于NHibernate,而是如何使用虚拟属性来实现延迟加载? 是否有任何关于我不知道的虚拟属性的隐藏行为?

在SaveChangesentity framework之后,延迟加载不起作用

在下面的函数中,在context.SaveChanges()之后,实体PropertyType始终为null。 我刚刚使用ObjectContext转换为DBContext(首先是数据库),在更改之前,它工作正常,现在却没有。 有什么我想念的吗? 我检查PropertyTypeID并且它被正确写入并存在于db中。 所有关系都在db和edmx文件中正确设置。 生成的.tt文件将PropertyType对象显示为虚拟对象。 这是EF 5。 这是代码(已删除实体属性的非重要分配): private ListingTransferDetail BeginListingTransferDetailReport(int PropertyTypeID) { ListingTransferDetail transfer_detail = new ListingTransferDetail(); transfer_detail.PropertyTypeID = PropertyTypeID; using (IDXEntities context = new IDXEntities()) { context.ListingTransferDetails.Add(transfer_detail); context.SaveChanges(); TransferProgress += “” + DateTime.Now + “: Transfer initialized for property type \”” + transfer_detail.PropertyType.DisplayName + “\”.”; } return transfer_detail; } 提前致谢。 编辑 我发现如果我在SaveChanges()之后添加这行代码,它就可以了。 […]

Lazy 实现和.NETgenerics

我一直在寻找延迟初始化的方法,并找到了包含在.NET 4中的Lazy 。 我正在考虑使用自己的Lazy for .NET 3.5实现(使用更简单的multithreading策略),我遇到了以下问题: Lazy基本上有两种类型的构造函数: class Lazy { public Lazy(){…} // ctor #1 它使用T的默认构造函数来创建T的实例,和 public Lazy(Func func){…} // ctor #2 这让调用者决定如何创建T的实例。 现在问题在于: 如果我想要第一个ctor的编译时检查,我将添加一个限制 class Lazy where T: new() {…} 在class级。 这将允许我使用new T()来创建一个实例; 但是这个限制对于第二个ctor来说不是必需的,更糟糕​​的是,它也限制了我可以使用的类型(对于那些有默认ctor的人) 如果我想能够使用任何类型的第二个ctor,我将不会设置任何限制,并在第一个ctor将使用reflection,以确保T确实有一个默认的ctor。 但是,这种方法缺少编译时检查,如果第一个ctor使用了错误的类型,则只会抛出运行时exception。 我的问题是:我可以充分利用这两个世界吗? 理想情况下,我想对ctor#1的每次使用进行编译时检查,但同时能够将ctor#2用于没有默认ctor的类型。 Microsoft实现如何执行此操作? (我不能轻易访问.NET 4源代码或dll)。 编辑:(在“reflection器”MS组件之后) 我检查了参考实现,它没有进行编译时检查。 它使用reflection作为’默认ctor’的情况,当然如果事情变坏则伴随着运行时exception。

Equals和GetHashCode中的延迟加载的NHibernate属性

如何处理以下问题? 我们正在使用延迟加载的NHibernate属性,每当我们调用Equals()或GetHashCode()任何使用的属性都将延迟加载,可能导致一系列延迟加载操作。 可以使用预先加载作为替代方案,但我认为仅在特定情况下而不是作为一般解决方案。 典型情况如下: public class AbstractSaveableObject { [Id(0, Name = “Id”, UnsavedValue = null)] [Generator(1, Class = “native”)] public virtual long? Id { get; set; } } [Class(NameType = typeof(ClassA))] public class ClassA : AbstractSavableObject { [Bag(0, Inverse = true, Cascade = “none”)] [Key(1, Column = “ClassA”)] [OneToMany(2, ClassType = typeof(ClassB))] public virtual ICollection […]

延迟加载 – 最好的方法是什么?

我见过很多懒加载的例子 – 你有什么选择? 给定一个模型类,例如: public class Person { private IList _children; public IList Children { get { if (_children == null) LoadChildren(); return _children; } } } Person类不应该知道它是如何被装载的……或者它应该是什么? 当然它应该控制何时填充属性? 您是否有一个将Person与其子集合耦合在一起的存储库,或者您是否会使用不同的方法,例如使用lazyload类 – 即便如此,我也不希望在我的模型体系结构中使用lazyload类模糊。 如果首先请求一个Person然后它的子节点(即在这个例子中不是延迟加载)或者以某种方式延迟加载,你将如何处理性能。 这一切都归结为个人选择吗?

使用NHibernate对延迟加载的集合进行分页

我读过这篇文章 ,其中Ayende表示NHibernate可以(与EF 4相比): 使用lazy =“extra”的集合 – Lazy extra意味着NHibernate适应您可能在集合之上运行的操作。 这意味着blog.Posts.Count不会强制加载整个集合,而是会从Posts中创建一个“select count(*),其中BlogId = 1”语句,而blog.Posts.Contains()同样会产生在单个查询中,而不是支付将整个集合加载到内存的价格。 集合filter和分页集合 – 这允许您在实体集合之上定义其他filter(包括分页!),这意味着您可以轻松浏览blog.Posts集合,而不必将整个内容加载到内存中。 所以我决定整理一个测试案例。 我创建了陈词滥调的Blog模型作为一个简单的演示,有两个类如下: public class Blog { public virtual int Id { get; private set; } public virtual string Name { get; set; } public virtual ICollection Posts { get; private set; } public virtual void AddPost(Post item) { if (Posts […]

entity framework延迟加载不适用于其他线程

我刚刚发现Entity Framework中的延迟加载仅适用于创建ObjectContext的线程。 为了说明这个问题,我做了一个简单的测试,一个简单的模型只包含2个实体: Person和Address 。 这是代码: private static void TestSingleThread() { using (var context = new TestDBContext()) { foreach (var p in context.Person) { Console.WriteLine(“{0} lives in {1}.”, p.Name, p.Address.City); } } } private static void TestMultiThread() { using (var context = new TestDBContext()) { foreach (var p in context.Person) { Person p2 = p; […]

用于.NET 3.5的Lazy 的实现

.NET 4.0有一个很好的实用程序类,名为System.Lazy ,它执行惰性对象初始化。 我想将这个类用于3.5项目。 有一次我在stackoverflow的答案中看到某个实现,但我再也找不到了。 有人有Lazy的替代实现吗? 它不需要框架4.0版本的所有线程安全function。 更新: 答案包含非线程安全和线程安全版本。

强制绑定到DataSource的复选框在尚未查看时进行更新

这是一个测试框架,用于显示我正在做的事情: 创建一个新项目 添加选项卡式控件 在标签1上放一个按钮 在选项卡2上放置一个复选框 将此代码粘贴到其代码中 (使用控件的默认名称) public partial class Form1 : Form { private List boolList = new List(); BindingSource bs = new BindingSource(); public Form1() { InitializeComponent(); boolList.Add(false); bs.DataSource = boolList; checkBox1.DataBindings.Add(“Checked”, bs, “”); this.button1.Click += new System.EventHandler(this.button1_Click); this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged); } bool updating = false; private void button1_Click(object sender, EventArgs e) […]