当行具有空值时,实体框架返回null对象

时间:2012-07-06 09:04:45

标签: c# linq entity-framework-4.3

我有一个现有的数据库(我无法以任何方式修改),我想使用EF进行编码。表之间没有主键,外键或实际关系 - 一切似乎都是由使用DB的应用程序处理的。对于大多数表/实体来说,这是微不足道的。但是,我有一个课程,就像下面的那个(简化),我正在努力。

[Table("tableName")]
public class MyClass
{
    [Key]
    [Column("id")]
    public int? Id { get; set; }

    [Column("name")]
    public string CompanyName { get; set; }

    [Column("address")]
    public string Address { get; set; }
}

_context.MyClasses.Where(x => x.Address == "something")之类的工作正常。但是,似乎当DB列中的id列为NULL时,我得到一个空对象 - 即使CompanyName和Address有值。我需要这些值,无论id(或其他)是否为null。有没有办法强制EF生成对象并忽略空列?

删除或移动[Key]属性会给我一个例外,例如“必须有一个键列”(如果有任何匹配,Id-column也用于将其他类的集合映射到这个类中)。

更新不要将Id列视为实际标识符。它基本上只是一个愚蠢名称的整数。

4 个答案:

答案 0 :(得分:2)

如果KeyAttribute在数据库中可以为空,则不能将其置于Id属性之上。这就是导致你出现问题的原因......

主键不能为空,但我想你知道......

答案 1 :(得分:2)

您必须拥有Key列,并且该列必须包含值才能生效。将列标记为Key表示这是该表的主键列。

如果Key列包含空值,则该行不会返回给客户端。如果Id列不是主键(因为它可以包含空值),那么您需要添加一个可以充当主键的新列。

答案 2 :(得分:1)

您需要有一个Key列。 EF要求你有一个。但是,出于您的目的,您可以使用其他方式:

将您的Id的StoreGeneratedPattern属性设置为Identity,并将其生成和管理保留为EF。不要将Id用于您的可空目的;创建另一个像MyId的列,它是Nullable而不是EntityKey,并以任何你想要的方式使用它。

答案 3 :(得分:1)

解决方案

就像Andreas Niedermair对我的问题发表评论一样,我现在已将[Key]添加到数据库中的多个列中。我发现在这种情况下,作为复合键的四列总是唯一的。

由于我从未向数据库中插入新内容,因此我认为这似乎是这种边缘情况下的一个不错的解决方案。