2012-07-06 148 views
2

我有一個現有數據庫(,我無法以任何方式修改),我想使用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(或其他)是否爲null。有什麼方法可以強制EF生成對象並忽略空列嗎?

刪除或移動[Key]屬性給了我一個例外,如「必須有一個關鍵列」(如果有任何匹配,Id列也用於將其他類的集合映射到這個集合中) 。

UPDATE不要將Id列視爲實際標識符。它基本上只是一個愚蠢的名字的整數。

+2

PK如何能爲空......不是通過技術選項,而是通過使用... – 2012-07-06 09:06:53

+0

它不是真正的DB中的PK,它似乎必須在實體中標記爲Key才能成爲能夠收集一些其他實體到它... – 2012-07-06 09:07:49

+1

btw爲「必須有一個關鍵列」存在一個解決方法:只需將所有列標記爲關鍵(如EF做它與ambigous意見),或添加一個新列(auto inc) – 2012-07-06 09:09:04

回答

1

解決方案

像安德烈亞斯Niedermair評論我的問題,我現在已經添加[重點],在數據庫中的多個列。我發現在這種情況下,四列作爲複合鍵總是唯一的。

因爲我永遠不會向數據庫中插入新內容,我猜這在邊緣情況下似乎是一個體面的解決方案。

2

如果在數據庫中可以爲空,則無法將KeyAttribute放在Id屬性上方。那是什麼導致你的問題......

的主鍵不能可空,但我猜你應該知道......

+0

這似乎是合理的,但爲什麼EF拋出異常,如果我刪除它?如前所述,數據庫中沒有實際的PK。 – 2012-07-06 09:09:39

+0

查看ChrisF的回答。 – 2012-07-06 09:10:21

+0

@ArveSystad,不,這是不合理的。考慮一個根本沒有唯一鍵的日誌表(你*可能擁有它,但通常不需要)。這是否意味着你不能用EF查詢這樣的表格? – UserControl 2016-06-27 14:15:49

2

你必須有一個Key列和列必須包含這個工作值。將列標記爲Key表示這是該表的主鍵列。

如果Key列包含空值,那麼該行將不會返回給客戶端。如果Id列不是主鍵(因爲它可以包含空值),那麼您需要添加一個可以充當主鍵的新列。

+0

但是,然後 - 爲什麼我不能刪除鍵屬性沒有得到例外回來?我有其他類似的表沒有鍵(無論是數據庫還是模型)。 – 2012-07-06 09:14:23

+0

@ArveSystad - 因爲你需要一個'Key'列。 – ChrisF 2012-07-06 09:15:06

+0

我有另一個班/表沒有一個完美的工作,所以我真的不明白爲什麼...... – 2012-07-06 09:18:23

1

您需要有一個Key列。英孚要求你有一個。不過,您可以使用其他方法:

將您的Id的StoreGeneratedPattern屬性設置爲Identity,並將其生成和管理設置爲EF。不要將Id用於可空目的;創建另一個列,如MyId,它是Nullable而不是EntityKey,並以任何您想要的方式使用它。

+0

如何/我在哪裏設置StoreGeneratedPattern屬性?它似乎是一個模型設計器的東西,我沒有一個edmx文件。 – 2012-07-06 09:23:37

+0

我相信你可以把StoreGeneratedPattern =「Identity」屬性放在模型定義,但我不確定 – Halo 2012-07-06 09:27:11