我有一个现有的数据库(我无法以任何方式修改),我想使用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列视为实际标识符。它基本上只是一个愚蠢名称的整数。
答案 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]添加到数据库中的多个列中。我发现在这种情况下,作为复合键的四列总是唯一的。
由于我从未向数据库中插入新内容,因此我认为这似乎是这种边缘情况下的一个不错的解决方案。