可能是一个简单的问题,但有些事我无法理解。
我的结构捆绑 - > BundleMembers - > InsuranceTypes
当我从BundleMembers中检索单个记录时,我包含了Bundle。 EF6自动包含Bundle中的所有BundleMembers
示例:
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; }
}
我没有包含BundleMemberInsuranceType
和InviteLink
,因为它们工作正常。
ApplicationDbContext的相关部分:
public DbSet<Bundle> Bundles { get; set; }
public DbSet<BundleMember> BundleMembers { get; set; }
答案 0 :(得分:1)
正如评论中所建议的那样:
实际上是期望所描述的行为。由于includeBundled设置为true,因此Bundles和引用的BundleMembers都在上下文中,而关系fixup将根据FK关系设置所有导航属性。
显然,这可以从Bundlemembers到Bundles以及从Bundles到BundleMembers,因为.Include只是创建SQL语句以将相关条目加载到上下文中,并且关系修复将完成剩下的工作。
要让捆绑包没有BundleMembers,您必须在上下文中加载它们而不使用BundleMembers并自己设置导航属性(EF将始终设置直接和反向导航属性)。为此,有两种主要方式:
- 在没有先前加载的BundleMembers的情况下将你的bundle加载到一个新的上下文中(最佳做法是将它们加载到内存中,因为IF导航属性由于急切加载而被加载;你可以将条目附加到两个上下文并且异常将被抛出)或
- 在将Bundles加载到其中之前,从上下文中解析BundleMembers。