C# 一对一关系未加载所有实体

C# 一对一关系未加载所有实体,c#,entity-framework,entity-framework-5,C#,Entity Framework,Entity Framework 5,我有一个(由于合同限制,人为地过度简化)数据模型,它应该如下所示: public class ProvisionalData { public int ProvisionalDataID { get; set; } public string Data { get; set; } public Lot Lot { get; set; } } public class Destination { public int DestinationID { get;

我有一个(由于合同限制,人为地过度简化)数据模型,它应该如下所示:

public class ProvisionalData
{
    public int ProvisionalDataID { get; set; }
    public string Data { get; set; }

    public Lot Lot { get; set; }
}

public class Destination 
{
    public int DestinationID { get; set; }
    public string Name { get; set; }
}

public class LotDestination
{
    public int LotDestinationID { get; set; }
    public int DestinationID { get; set; }
    public DateTime Month { get; set; }

    public Destination Destination { get; set; }
}

public class Lot
{
    public int LotID { get; set; }
    public int ProvisionalDataID { get; set; }
    public int LotDestinationID { get; set; }


    public ProvisionalData ProvisionalData { get; set; }
    public LotDestination LotDestination { get; set; }
}
public class ProvisionalData
{
public int ProvisionalDataID { get; set; }
public string Data { get; set; }

public IList<Lot> Lots { get; set; }
}
public class LotConfig : EntityTypeConfiguration<Lot>
{
    public LotConfig()
    {
        ToTable("Lot");
        HasKey(x => x.LotID);

        HasRequired(x => x.ProvisionalData)
            .WithMany(x => x.Lots)
            .HasForeignKey(x => x.ProvisionalDataID);
    }
}
从批次到临时数据的关系在双方都是一对一的。请注意,这不是整个模型,也不是关注的领域。问题在于配置一对一关系

My与一对一映射配置相关:

public class LotConfig : EntityTypeConfiguration<Lot>
{
    public LotConfig()
    {
        ToTable("Lot");
        HasKey(x => x.LotID);

        HasRequired(x => x.ProvisionalData)
            .WithRequiredDependent(x => x.Lot)
            .WillCascadeOnDelete(true);
    }
}


public class ProvisionalDataConfig : EntityTypeConfiguration<ProvisionalData>
{
    public ProvisionalDataConfig()
    {
        ToTable("ProvisionalData");
        HasKey(x => x.ProvisionalDataID);
    }
}
在我的真实数据集中,这个查询将返回一个包含30个批次的目的地。其中16个地块的临时数据导航属性已加载。14不要这样做。当我手动循环遍历每个批次和
db.Entry(Lot.Reference)(临时数据).Load()
时,此问题仍然存在。当我检查这些条目时,对于
.IsLoaded
,所有30个返回
true
。查询和
.Includes
似乎在做它们应该做的事情,但是一些实体由于我不理解的原因没有回来。我希望这是我看不见的简单的东西,因为我盯着它看太久了

但是,当我将关系(忽略现有数据库约束)更改为一对多关系时,临时数据实体如下所示:

public class ProvisionalData
{
    public int ProvisionalDataID { get; set; }
    public string Data { get; set; }

    public Lot Lot { get; set; }
}

public class Destination 
{
    public int DestinationID { get; set; }
    public string Name { get; set; }
}

public class LotDestination
{
    public int LotDestinationID { get; set; }
    public int DestinationID { get; set; }
    public DateTime Month { get; set; }

    public Destination Destination { get; set; }
}

public class Lot
{
    public int LotID { get; set; }
    public int ProvisionalDataID { get; set; }
    public int LotDestinationID { get; set; }


    public ProvisionalData ProvisionalData { get; set; }
    public LotDestination LotDestination { get; set; }
}
public class ProvisionalData
{
public int ProvisionalDataID { get; set; }
public string Data { get; set; }

public IList<Lot> Lots { get; set; }
}
public class LotConfig : EntityTypeConfiguration<Lot>
{
    public LotConfig()
    {
        ToTable("Lot");
        HasKey(x => x.LotID);

        HasRequired(x => x.ProvisionalData)
            .WithMany(x => x.Lots)
            .HasForeignKey(x => x.ProvisionalDataID);
    }
}

所有临时数据都会返回,但某些目的地不会返回。这向我暗示,它与在一对一中包含多个层次的导航属性有关。以前是否有其他人经历过这种行为?

除了在共享主键1:1关联情况下,EF不正式支持1:1关联

你所做的是创造1:1的,并试图告诉英孚,这是一个真正的1:1。问题是,db模式实际上是一个1:many模式,EF在这里会有问题


如果您的要求是1:1,那么您需要使用共享主键(两个实体都有相同的主键),一个实体也将其视为外键。

我以前遇到过问题,我的解决方案是使用1:many,因为如果POCOA包括POCOB

.Include(x => x.POCOA.POCOB) 

真正将POCOB作为列表返回,因为我们知道它100%返回一条记录,然后在获取数据时,我们可以说a.SingleOrDefault()

我应该注意到,在我们的模型中,数据库是第一位的,SQL Server在添加适当的约束(我们有)时会将这种关系识别为一对一关系。这似乎是使用共享主键的合理替代方案(我想我不知道这是否是SQL世界中的标准/公认方法——这更像是DBA的问题,但这是我们最初是如何做到的)。你知道这是否是EF团队有意识的设计决策吗?@jgoeglein-EF不支持任何类型的约束,因此它需要共享主键。这是保证(无约束)模型得到实施的唯一方法。因此,是的,这是一个有意识的决定,因为缺乏对约束的支持。是的,这是合理的,但没有支持。在EF6中,您可以通过使用存储的proc来支持模型,从而避免这种情况。然而,EF6仍处于测试阶段,可能要到秋天才会发布。不过,再想想,我想我不知道英孚将如何与sproc公司合作。我只是想向大家鞠躬,事实证明,如果您不关心关系的双向性,那么就不必使用共享主键-您可以在一对多之间建立单向关联,而无需配置多个边以产生约束的假象:@jgoeglein-虽然这可能会起作用,但可以无误地为您提供所需的结果,请记住,EF模型仍然会考虑这1个:很多,如果你做出改变而不是绊倒的话,你必须小心。