我在使用预先加载加载子实体时遇到问题,急切加载在项目的其他任何地方都能正常工作,但它不能处理任何字符串外键。我的模特是:
public class Listing : BaseAudit<int>
{
public int? CommunityId { get; set; }
public string LotId { get; set; }
public Lot Lot { get; set; }
}
public class Lot : BaseAudit<string>
{
public ICollection<Listing> Listings { get; set; }
}
public class BaseAudit<T> : BaseId<T>
{
public BaseAudit()
{
CreatedDate = DateTime.Now;
}
public DateTime? CreatedDate { get; set; }
public string CreatedBy { get; set; }
public DateTime? UpdatedDate { get; set; }
public string UpdatedBy { get; set; }
}
public class BaseModel
{
public BaseModel()
{
Active = true;
}
public bool Active { get; set; }
}
public class BaseId<T> : BaseModel
{
public T Id { get; set; }
}
我正在尝试加载Lot
我曾尝试Listing
的{{1}}属性:
_db.Listings.Where(m => m.CommunityId == communityId && m.LotId != null).Include(a => a.Lot).ToList();
我已经检查过它是通过使用断点生成正确的SQL但它总是返回所有Lot
属性为null。我无法弄清楚我在这里做错了什么。
答案 0 :(得分:0)
简答: Listings
应该是虚拟收藏; LotId
永远不会为空,Include
应该在您的DbSet之后。你应该建模你的继承策略
答案很长
您似乎尝试在Lots
和Listings
之间配置一对多关系:每个Lot
都有零个或多个Listings
且每个Listing
属于只有一个Lot
。
对于正确的一对多,您应该声明您的虚拟列表集合
public virtual ICollection<Listing> Listings { get; set; }
由于一对多关系,没有Listing
没有Lot
因此,Lot的主键LotId
的外键永远不会为空。< / p>
所以你有一个可以为空的communityId
(这是真的吗?还是社区是一个int?),你希望Listings
批{{1}具有相同值的所有Listing.CommunityId inclusive the one and only
1}} listing`有:
this
如果这没有帮助,那么继承的使用可能会导致问题。关系数据库不了解继承的概念。您应该使用流畅的API(或属性)告诉实体框架,继承策略可以在表中进行建模。见Inheritance Strategies
最后我看到一些主键是int,而一些主键是字符串。这是真的有意吗?它有用吗?
答案 1 :(得分:0)
EF6在相关实体上不支持Include
Where
。
可能的解决方法:Entity Framework: Filtering Related Entity Collections
从实体框架6开始,没有办法过滤相关的内容 使用.Include()。
时会加载实体