2011-10-20 111 views
0

我有以下型號:我如何定義1:EF代碼第一個C的關係

public class Device 
{ 
    [Key] 
    public int ID { get; set; } 

    public int? SimCardID{ get; set; } 

    [ForeignKey("SimCardID")] 
    public virtual SimCard { get; set; } 

    [DataType(DataType.Text)] 
    [Required] 
    [MaxLength(16)] 
    public string Imei { get; set; } 

    [DataType(DataType.Text)] 
    [Required] 
    [MaxLength(20)] 
    public string Name { get; set; } 
} 

public class SimCard 
{ 
    [Key] 
    public int ID { get; set; } 

    [DataType(DataType.PhoneNumber)] 
    [Required] 
    [MaxLength(20)] 
    public string PhoneNumber { get; set; } 

    [DataType(DataType.Text)] 
    [Required] 
    [MaxLength(40)] 
    public string SerialNumber { get; set; } 

    [DataType(DataType.Text)] 
    [Required] 
    [MaxLength(20)] 
    public string Provider { get; set; } 
} 

一臺設備(1)具有在一個最(C)的SIM卡。因此關係是1:c。我如何在EF Code First中實施?

+0

如果您不使用鏈接表,則您的設計是正確的。問題是什麼? – Eranga

+0

由EF生成的數據庫對於這些型號具有一對多(1:mc)關係 – Sandro

+0

一個SIM卡可以位於多個設備中。 – Eranga

回答

3

該關係不能與EF映射,甚至在數據庫中不起作用。

你說SIM卡車可以在沒有設備的情況下存在。沒關係,但你也可以說設備可以在沒有SIM卡的情況下存在,你仍然想要參照完整性和一對一的關係。這是什麼意思?

這意味着,設備表必須有:

  • FK列SIM卡(關係)
  • FK列必須是可空(設備可以在不SIM卡存在)
  • FK列必須有獨特的索引(SIM卡只能分配給一個設備)

第一個問題是在數據庫中。如果你把唯一的索引放在可空列中,你會得到一些驚訝的結果 - null被認爲是值,只有單個記錄可以賦空值否則它會違反唯一約束=>這意味着你只能有一個沒有SIM卡的設備。

第二個問題在EF中。 EF不支持唯一鍵,因此它不會看到這種一對一關係(並且它不會爲您創建索引)。在EF中使用真正的一對一關係的唯一可能性是將FK放置在設備的PK =設備上將具有與SIM相同的PK值,但在這種情況下,不能沒有沒有SIM卡的設備。

+0

我明白了......所以現在的問題是,我的模型甚至不能用作數據庫。我需要改變什麼?我的意思是必須有一種方法來做到這一點。例如:一個男人可以和一個女人結婚。但是一個男人也是存在的,當他沒有結婚的時候。一個女人也是如此。 – Sandro

+0

您必須確保應用程序邏輯中的約束條件,並將其設置爲數據庫中的一對一模式,其中一個設備可以有多個SIM卡(因爲它的確可以使用某些設備)。在婚姻的情況下,它也由法律強制執行。 –

+0

這對我們的設備來說是不可能的:)所以......你說在數據層中不可能實現這種情況,我不得不在應用程序邏輯中擔心它? – Sandro