2011-07-23 81 views
1

我有一個經典的一對多關係,除了「多」一側的每個項目都沒有「one」之外。這裏是我的表:首先在EF代碼中的非零多到零或一個關係?

會議:

ID  IP 
1   1.1.1.1 
2   2.2.2.2 

USERS:

IP  NAME 
1.1.1.1 John 

...從以下POCO的產生:

public class Session { 
    public int  id { get; set; } 
    public long ip { get; set; } 
} 

public class User { 
    [Key] 
    public long ip { get; set; } 
    public string name { get; set; } 
    public ICollection<Session> sessions { get; set; } 
} 

一些會話有一個相應的用戶(通過IP)。即使沒有關聯的用戶,我也想保留IP,並且能夠導航User.sessions。

有了上面的POCO,EF可以理解地從Session.ipUser.ip生成一個FK,從而阻止我插入帶有與用戶不相關的IP的Sessions。使Session.ip爲空可以允許我插入與用戶無關的會話,但是我失去了IP(它必須爲空)。

有什麼辦法可以達到這個目的嗎?

萬分感謝。

回答

1

我會修改POCO類是這樣的:

public class Session 
{ 
    public int id { get; set; } 
    public long ip { get; set; }  
    public User User {get;set;} 
} 

public class User 
{ 
    [Key] 
    public int id { get; set; } 
    public long ip { get; set; } 
    public string name { get; set; } 
    public ICollection<Session> sessions { get; set; } 
} 

這將在會話表創建一個可空USER_ID領域,應該給你想要的結果。請注意,這已經將ip作爲用戶表上的PK刪除,並將其更改爲通用整數ID。

希望這會有所幫助!

+0

謝謝。我也考慮過這個解決方法,但想知道是否有根本的解決方案。我的會話表很大(每天1GB以上的新數據),而且我不想存儲不必要的列,並且出於性能原因嘗試避免使用空值。 – daniellm

+0

你嘗試過在你重寫OnModelCreating的DbContext ......我想你可以刪除外鍵(modelBuilder.Entity ().HasMany(X => x.sessions).WithOptional()) } – JasonD

+0

不,有與將Session.ip定義爲可爲空相同,即它生成的FK必須爲null或指向有效的用戶,但不能指向不存在的用戶。 – daniellm