外键中的实体框架异常2

时间:2014-06-30 15:50:55

标签: c# .net linq entity-framework

嗨我有两张这样的桌子:

public class TableA
{
    public int IdTableA { get; set; }

    public string OtherInfo { get; set; }

    public int? IdTableB { get; set; }

    public TableB TableB { get; set; }
}

public class TableB
{
    public TableB()
    {
        TableAs = new HashSet<TableA>();
    }

    public int IdTableB { get; set; }

    public string Description { get; set; }

    public ICollection<TableA> TableAs { get; set; }
}

TableATableB中的外键映射是这样的:

this.HasOptional(t => t.TableB)
    .WithMany(t => t.TableAs)
    .HasForeignKey(d => d.IdTableB);

现在我尝试从TableA中选择一些数据:

context
    .TableA
    .Select(s => new TableA_DTO
    {
        IdTableA = s.IdTableA,
        OtherInfo = s.OtherInfo,
        IdTableB = s.IdTableB,
        TableB = new TableB_DTO
        {
            IdTableB = s.TableB.IdTableB,
            Description = s.TableB.Description
        }
    }).ToList();

当我在TableA中有一行IdTableB = null时出现问题。我得到了这个例外:

  
    

演员价值类型&#39; Int32&#39;失败,因为具体化值为null。结果类型的通用参数或查询必须使用可空类型。

  

如何使用实体框架选择此信息?

1 个答案:

答案 0 :(得分:1)

您需要空检查:

context
    .TableA
    .Select(s => new TableA_DTO
    {
        IdTableA = s.IdTableA,
        OtherInfo = s.OtherInfo,
        IdTableB = s.IdTableB,
        TableB = new TableB_DTO
        {
            IdTableB = (s.TableB != null) ? s.TableB.IdTableB : null,
            Description = (s.TableB != null) ? s.TableB.Description : null
        }
    }).ToList();

或者可能:

TableB = s.TableB != null 
        ? new TableB_DTO
        {
            IdTableB = (s.TableB != null) ? s.TableB.IdTableB : null,
            Description = (s.TableB != null) ? s.TableB.Description : null
        }
        : null

编辑:根据以下评论,该错误是因为上下文或SQL不知道TableA_DTO。您需要做的是首先有效地获得结果集:

var data = context.TableA.Include("TableB").ToList(); 'ToList executes

然后,选择此项并转换为所需类型:

//This is a LINQ to Objects operation now, which can do any kind of data transformation
var results = data.Select(s => new TableA_DTO { ... });

这将有效,但您必须确保您未通过实体框架在以下迭代中检索相关数据而进入选择N + 1场景。