【发布时间】:2015-06-20 22:35:20
【问题描述】:
我已经设置了实体框架,它在我需要的大部分时间都可以正常工作。我有这样的结构
public partial class Topic : Entity
{
public Guid Id { get; set; }
public string Name { get; set; }
public DateTime CreateDate { get; set; }
public virtual Post LastPost { get; set; }
public virtual Category Category { get; set; }
public virtual IList<Post> Posts { get; set; }
public virtual IList<TopicTag> Tags { get; set; }
public virtual MembershipUser User { get; set; }
public virtual IList<TopicNotification> TopicNotifications { get; set; }
public virtual IList<Favourite> Favourites { get; set; }
public virtual Poll Poll { get; set; }
}
如您所见,我有许多相关实体是列表。这些被映射为标准并且是延迟加载的,因此我可以调用 Topic.Posts 或 Topic.TopicNotifications 等...(下面的映射)
HasOptional(t => t.LastPost).WithOptionalDependent().Map(m => m.MapKey("Post_Id"));
HasOptional(t => t.Poll).WithOptionalDependent().Map(m => m.MapKey("Poll_Id"));
HasRequired(t => t.Category).WithMany(t => t.Topics).Map(m => m.MapKey("Category_Id"));
HasRequired(t => t.User).WithMany(t => t.Topics).Map(m => m.MapKey("MembershipUser_Id"));
HasMany(x => x.Posts).WithRequired(x => x.Topic).Map(x => x.MapKey("Topic_Id")).WillCascadeOnDelete();
HasMany(x => x.TopicNotifications).WithRequired(x => x.Topic).Map(x => x.MapKey("Topic_Id")).WillCascadeOnDelete();
HasMany(t => t.Tags)
.WithMany(t => t.Topics)
.Map(m =>
{
m.ToTable("Topic_Tag");
m.MapLeftKey("TopicTag_Id");
m.MapRightKey("Topic_Id");
});
这都是一口井。但在某些情况下,我需要手动填充 Topic.Posts 和 Topic.Favorites。
但是如果我尝试设置Topic.Posts = SomeCollection,它会触发延迟加载并首先加载所有帖子,然后让我设置我的集合,以便执行两组 sql(第一组我不想要)
有没有在我想手动设置集合时按需手动关闭延迟加载?
希望这是有道理的...:/
【问题讨论】:
-
我在这里感觉到一个 XY 问题meta.stackexchange.com/a/66378/134199 - 我认为您真正的问题是“需要手动填充 Topic.Posts 和 Topic.Favorites”。您可能正在尝试以不同的方式完成更好的事情,因为您正在做的事情没有任何意义。你到底想要做什么......为什么?
-
我会支持@ErikFunkenbusch 所说的话。为什么需要手动重新创建帖子和收藏夹集合?
-
如果你回答了你想要做的事情,那么我们实际上可能能够帮助你解决你真正的问题.. 没有你认为你有的问题,因为你认为你必须做一件特别的事情来解决你真正的问题。
标签: c# entity-framework linq-to-entities entity-framework-6