实体框架:急于加载不使用字符串外键

时间:2017-10-29 09:52:38

标签: c# entity-framework ef-code-first

我在使用预先加载加载子实体时遇到问题,急切加载在项目的其他任何地方都能正常工作,但它不能处理任何字符串外键。我的模特是:

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。我无法弄清楚我在这里做错了什么。

2 个答案:

答案 0 :(得分:0)

简答: Listings应该是虚拟收藏; LotId永远不会为空,Include应该在您的DbSet之后。你应该建模你的继承策略

答案很长 您似乎尝试在LotsListings之间配置一对多关系:每个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()。

时会加载实体