3

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

[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")工作正常的事情。但是,似乎当数据库中的 id 列为 NULL 时,我得到一个空对象——即使 CompanyName 和 Address 有值。而且我需要这些值,无论 id (或其他)是否为空。有没有办法强制 EF 生成对象并忽略空列?

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

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

4

4 回答 4

3

如果 KeyAttribute 在数据库中可为空,则不能将 KeyAttribute 置于 Id 属性之上。这就是给你带来问题的原因......

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

于 2012-07-06T09:08:29.970 回答
2

您必须有一Key列,并且该列必须包含值才能正常工作。将列标记为Key表示这是该表的主键列。

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

于 2012-07-06T09:08:46.507 回答
1

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

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

于 2012-07-06T09:14:33.790 回答
1

解决方案

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

Since I'm never inserting new content to the database, this seems like a decent solution in this edge case scenario, I guess.

于 2012-07-06T10:59:37.877 回答