Tag: lazy loading

在深度不可变类型上进行延迟初始化是否需要锁定?

如果我有一个非常不可变的类型(所有成员都是只读的,如果它们是引用类型成员,那么它们也引用了非常不可变的对象)。 我想在类型上实现一个惰性初始化属性,如下所示: private ReadOnlyCollection m_PropName = null; public ReadOnlyCollection PropName { get { if(null == m_PropName) { ReadOnlyCollection temp = /* do lazy init */; m_PropName = temp; } return m_PropName; } } 据我所知: m_PropName = temp; ……是线程安全的。 我并不担心两个线程同时竞争初始化,因为它很少见,从逻辑角度来看两个结果都是相同的,如果我没有,我宁愿不使用锁至。 这会有用吗? 优缺点都有什么? 编辑:谢谢你的回答。 我可能会继续使用锁。 但是,我很惊讶没有人提出编译器意识到临时变量是不必要的可能性,只是直接分配给m_PropName。 如果是这种情况,则读取线程可能会读取尚未完成构造的对象。 编译器是否会阻止这种情况? (答案似乎表明运行时不会允许这种情况发生。) 编辑:所以我决定使用由Joe Duffy撰写的这篇文章启发的Interlocked CompareExchange方法。 基本上: private ReadOnlyCollection m_PropName = […]

NHibernate.LazyInitializationException

我们偶尔会出现这个问题,但现在我每次都可以重现它。 我在自定义构建的论坛上增加了一个视图计数器,这会导致错误: NHibernate.LazyInitializationException:无法懒惰地初始化集合,没有会话或会话被关闭 在对象中的另一个集合上发生此错误。 如果我添加: .Not.LazyLoad() 对于我的Fluent映射,错误在我的项目周围移动。 我一直禁止对对象的延迟加载,直到它没有延迟加载的地方,然后它抛出了这个错误: NHibernate.LazyInitializationException:无法初始化代理 – 没有会话。 所以,然后我在懒惰的装载上取出了遗嘱,现在我又恢复了原点。 当我递增此视图计数器时,它只会出错。 这是我的基类保存代码的片段: using (ISession session = GetSession()) using (ITransaction tx = session.BeginTransaction()) { session.SaveOrUpdate(entity); tx.Commit(); } 环顾四周,我在另一篇文章中读到这些交易可能会导致问题,但这是因为它们被放置在哪里。 此代码扩展到与我的域对象(存储库类)分开的类。 这是post: hibernate:LazyInitializationException:无法初始化代理 我不相信这是我的问题。 这是第一个抛出错误的集合的流畅映射。 还有其他几个类似的集合。 HasManyToMany(x => x.Votes) .WithTableName(“PostVotes”) .WithParentKeyColumn(“PostId”) .WithChildKeyColumn(“VoteId”);

EF Code First Lazy loading不工作

我首先使用EF6代码,但似乎无法使延迟加载工作。 急切的装载工作正常。 我有以下课程: public class Merchant : User { … public virtual ICollection MerchantLocations { get; set; } } public class MerchantLocation : BaseEntity { … public int MerchantId { get; set; } public virtual Merchant Merchant { get; set; } } public class User : BaseEntity { … } public class BaseEntity { … […]

使用NoRM在MongoDB中进行延迟加载

我有一个类似的模型:(简化) 题: public class Question { public string QuestionID { get; set; } public string Title { get; set; } public string Body { get; set; } public List Answers { get; set; } } 回答: public class Answer { public string QuestionID { get; set; } public string Body { get; set; } } […]

使用用户控件的延迟加载选项卡

我想在AJAX选项卡容器中使用延迟加载选项卡。 我已经实现了它。 但是我遇到的问题是,当我点击一个按钮或触发该用户控件中的任何事件时,它不会被触发; 什么都没发生。 代码隐藏: protected void TabContainerUp_ActiveTabChanged(object sender, EventArgs e) { string tabName = TabContainerUp.ActiveTab.ID; getActiveTab(tabName); } public void getActiveTab(string tabName) { UserControl uc; //uc. switch (tabName) { case “tab1”: pnlUC1.Controls.Clear(); uc = Page.LoadControl(“~/Controls/UC1.ascx”) as UserControl; pnlUC1.Controls.Add(uc); break; case “tab2”: pnlUC2.Controls.Clear(); uc = Page.LoadControl(“~/Controls/UC1.ascx”) as UserControl; pnlUC2.Controls.Add(uc); break; } }

将这个foreach产量重写为linq产量?

假设我有以下代码(上下文缩小以保持问题范围有限) public static IEnumerable GetThemColors(){ var ids = GetThePrimaryIds(); foreach (int id in ids){ yield return GetColorById(id); } ids = GetTheOtherIds(); foreach (int id in ids){ yield return GetOtherColorsById(id); } } 我想把它们改写成这样的东西(当然不会编译 public static IEnumerable GetThemColors(){ GetThePrimaryIds().Select(id=>yield return GetColorById(id)); GetTheOtherIds().Select(id=>yield return GetOtherColorsById(id)); } 关键点在于,在我的第一个片段中,我有两个foreach枚举器屈服,我不知道如何在linq中做什么而不会丢失我的延迟加载function。

EF 6懒惰加载禁用,但儿童记录负载无论如何

我先使用EF6代码。 有两个表, Lesson和LessonSections 。 LessonSections表具有LessonSections的外键 这是Lesson类,没有删除任何重要字段: public partial class Lesson { [System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”, “CA2214:DoNotCallOverridableMethodsInConstructors”)] public Lesson() { LessonSections = new HashSet(); } [StringLength(50)] public string Id { get; set; } [System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”, “CA2227:CollectionPropertiesShouldBeReadOnly”)] public virtual ICollection LessonSections { get; set; } } 以下是我启动数据模型的方法: var db = new Touch_Type_Trainer_DB.DataModel(); db.Configuration.ProxyCreationEnabled = false; db.Configuration.LazyLoadingEnabled = false; 在我第一次调用数据库以检索数据库中的第一课后,生成的对象没有LessonSections 然后我再次调用将这些部分检索到一个单独的对象中。 (它们必须位于单独的对象中,因为我想将它们序列化为JSON字符串,并且如果我使用标准EF […]

存储库模式中的IQueryable与IEnumerable,延迟加载

我已经阅读了一些文章,声明IEnumerable用于模仿存储过程或限制数据库。 外部提供商丢失了延迟加载能力。 IQueryable可以为开发人员提供更大的灵活性。 懒惰装载就在那里。 在性能方面,两者都消耗了大量的性能..哪一个更优选?

entity framework渴望加载不返回数据,延迟加载

我首先使用代码EF5 ,我有一个对象,其集合定义为virtual (延迟加载)。 这会在调用时返回数据。 但是我希望它能够满载。 我从属性签名中删除了virtual ,但现在它总是返回null数据。 EF甚至不运行查询 ,任何人都可以帮忙吗? 编辑:我知道.include()我只是喜欢使用非虚拟属性方法。 对象 User ( [Key] Id在Resource对象上,该对象是person类的Parent): namespace Entities { [Table(“Users”)] public class User : Person { [Required] public ICollection Roles { get; set; } } } 角色: namespace Entities { public class Role { [Key] public string Id { get; set; } public virtual ICollection Users […]

Lazy :“函数评估需要所有线程运行”

我有一个带有一些静态属性的静态类。 我在静态构造函数中初始化了所有这些,但后来意识到它是浪费的,我应该在需要时懒惰加载每个属性。 所以我切换到使用System.Lazy类型来完成所有脏工作,并告诉它不要使用它的任何线程安全function,因为在我的情况下执行始终是单线程的。 我最后得到了以下课程: public static class Queues { private static readonly Lazy g_Parser = new Lazy(() => new Queue(Config.ParserQueueName), false); private static readonly Lazy g_Distributor = new Lazy(() => new Queue(Config.DistributorQueueName), false); private static readonly Lazy g_ConsumerAdapter = new Lazy(() => new Queue(Config.ConsumerAdaptorQueueName), false); public static Queue Parser { get { return g_Parser.Value; } […]