【问题标题】:Entity Framework 6 and navigational property issue实体框架 6 和导航属性问题
【发布时间】:2014-08-10 12:43:15
【问题描述】:

我希望在这里得到您的帮助。我对 EF 很陌生,遇到了一些麻烦。我正在使用 Database First 方法,并且在 Azure 中有一个数据库,我必须从中检索数据。

[DataContract]
[Table("A")]
public class AgencyDC
{

    [DataMember]
    [Key]
    public string AID { get; set; }
    public string AName { get; set; }
    public string GeneralEmailAddress { get; set; }
    public string WebsiteURL { get; set; }
    [DataMember]
    [ForeignKey("AID")]
    [IgnoreDataMember]
    public virtual AExtensionDC AExtension { get; set; }
}

[DataContract]
[Table("AExtension")]
public class AExtensionDC
{
    [DataMember]
    [Key]
    public string AID { get; set; }
    [DataMember]
    public bool? IsActive { get; set; }
    public bool? IsOptedOut { get; set; }
    public DateTime? LastUpdated { get; set; }
}

我正在尝试使用 EF6 在我的上下文中使用 DBSets 检索我的记录..

public List<ADataCcontract> GetAllAs()
    {
        using (AContext _aCtx = new AContext())
        {                
            var mylist = _aCtx.A.Include("AExtension").ToList();
            return mylist;
        }            
    }

现在,我应该返回 547 条记录,其中只有 1 条具有 AExtension 导航属性,其中包含内容。其他 546 条记录应包含 NULL。但是,出于某种原因,我只得到似乎在两个表中都有匹配的记录。在 SQL 语言中,我只是想要一个左连接,以便从 AE 实体返回所有行,并在 AE 中选择匹配。

我希望这是有道理的。

如果可能的话,如果您有解决办法,能否请您发布一个我可以参考的示例?我真的被困住了。

【问题讨论】:

    标签: c# entity-framework wcf


    【解决方案1】:

    我认为这个 SO Answer 可能会帮助您解决大部分问题? https://stackoverflow.com/a/4299667/78551

    基本上包括左外连接或左连接,因为“外”在 SQL 中实际上是可选的。

    【讨论】:

    • 谢谢。我阅读了这篇文章,它建议 .Include() 应该已经在进行左连接。但我回来的结果集表明并非如此。我确定它是我的实现,但我无法使用文章和进度中的任何内容。我的一个实体类中的属性有问题吗?
    • 您是否删除了 Include() 以查看是否返回了您正在寻找的整个列表?
    • 我有。当我没有包含 Include() 时,我没有获得导航属性。我刚刚决定去老学校并使用数据集:) 我真的不想走这条路,但我就是不知道如何让这项工作像我认为的那样工作。也许是下一个项目。
    • 如果使用 Include(),则只有具有相关对象的对象才会填充导航属性。否则,它们将保留为空。除非您添加其他约束,例如 Where(),否则您仍然会取回所有父对象。
    【解决方案2】:

    如果您的字段具有/缺少可空性,则“.Include”将执行左连接/内连接。

    要查看您的查询,请放置一个断点并检查此值:

      var myQuery = _aCtx.A.Include("AExtension").ToTraceString();
    

    【讨论】:

    • 我得到以下编译错误...类型“AExtensionDS”必须是不可为空的值类型,才能将其用作泛型类型中的参数“T”或mentod“System.可空'
    • 抱歉,没记住。现在只需检查查询。我会尽快更新替代方案。我正在努力记住。
    • 是的,它正在进行内部连接。{SELECT 1 AS [C1], [Extent1].[AID] AS [AID], [Extent1].[AName] AS [AName], [ Extent1].[GeneralEmailAddress] AS [GeneralEmailAddress], [Extent1].[WebsiteURL] AS [WebsiteURL], [Extent2].[AID] AS [AID1], [Extent2].[IsActive] AS [IsActive], [Extent2] .[IsOptedOut] AS [IsOptedOut], [Extent2].[LastUpdated] AS [LastUpdated] FROM [dbo].[A] AS [Extent1] INNER JOIN [dbo].[AExtension] AS [Extent2] ON [Extent1]。 [AID] = [Extent2].[AID]}
    • 如果您希望 C# 查询简短,请尽量不要添加 ForeingKey 关系。并添加一个延迟加载属性。否则,请检查:progware.org/Blog/post/…
    • 感谢您的帖子,但此链接还建议 Include() 方法应导致左外连接。出于某种原因,我的 include() 没有给我那个。我一直在试图找出原因并阅读它应该如何工作的地方,但我一直在做空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多