EF6自动包含嵌套对象

时间:2016-06-07 10:14:00

标签: asp.net asp.net-mvc entity-framework asp.net-core

可能是一个简单的问题,但有些事我无法理解。

我的结构捆绑 - > BundleMembers - > InsuranceTypes

当我从BundleMembers中检索单个记录时,我包含了Bundle。 EF6自动包含Bundle中的所有BundleMembers

示例:

enter image description here

public async Task<List<BundleMember>> GetBundleMembers(string userId, bool includeBundle, bool includeInsuranceTypes)
{
    var bundleMembers = db.BundleMembers.Where(m => string.Equals(m.UserId, userId, StringComparison.CurrentCultureIgnoreCase));
    if (includeBundle)
    {
        bundleMembers = bundleMembers.Include(o => o.Bundle);
    }
    if (includeInsuranceTypes)
    {
        bundleMembers = bundleMembers.Include(m => m.BundleMemberInsuranceType);
    }

    return await bundleMembers.ToListAsync();
}

我这样称呼函数:

GetBundleMembers(_userManager.GetUserId(User), true, false)

我是否必须从Bundle访问数据,以避免这种情况?

编辑1: 我的数据模型如下所示:

public class Bundle
    {
        public int BundleId { get; set; }

        public State State { get; set; }
        public ICollection<BundleMember> Members { get; set; }
        public ICollection<InviteLink> InviteLinks { get; set; }
        public string BundleName { get; set; }
        public string Description { get; set; }
        public string ImagePath { get; set; }

    }
    public enum State
    {
        NotApproved,
        Approved,
        Disabled,
        Rejected
    }

    public class BundleMember
    {
        public ApplicationUser User { get; set; }
        public string UserId { get; set; }
        public int BundleMemberId { get; set; }
        public int BundleId { get; set; }
        public Bundle Bundle { get; set; }
        public bool Admin { get; set; }
        public int Price { get; set; }
        public int Coverage { get; set; }
        public ICollection<BundleMemberInsuranceType> BundleMemberInsuranceType { get; set; }
    }

我没有包含BundleMemberInsuranceTypeInviteLink,因为它们工作正常。

ApplicationDbContext的相关部分:

public DbSet<Bundle> Bundles { get; set; }
public DbSet<BundleMember> BundleMembers { get; set; }

1 个答案:

答案 0 :(得分:1)

正如评论中所建议的那样:

实际上是期望所描述的行为。由于includeBundled设置为true,因此Bundles和引用的BundleMembers都在上下文中,而关系fixup将根据FK关系设置所有导航属性。

显然,这可以从Bundlemembers到Bundles以及从Bundles到BundleMembers,因为.Include只是创建SQL语句以将相关条目加载到上下文中,并且关系修复将完成剩下的工作。

要让捆绑包没有BundleMembers,您必须在上下文中加载它们而不使用BundleMembers并自己设置导航属性(EF将始终设置直接和反向导航属性)。为此,有两种主要方式:

- 在没有先前加载的BundleMembers的情况下将你的bundle加载到一个新的上下文中(最佳做法是将它们加载到内存中,因为IF导航属性由于急切加载而被加载;你可以将条目附加到两个上下文并且异常将被抛出)或

- 在将Bundles加载到其中之前,从上下文中解析BundleMembers。