2011-06-22 246 views
4

我有我認爲是一個非常簡單的數據模型,並且我正在與EF 4.1 CF一起苦苦掙扎。EF 4.1一對多關係

我的數據模型有兩類:

public class Site { 
    public int id { get; set; } 
    public string name { get; set; } 

    public ICollection<Building> buildings { get; set; } 
} 

public class Building { 
    public int id { get; set; } 
    public int siteId { get; set; } 
    public string name { get; set; } 
} 

我的配置文件是這樣的:

public class SiteConfiguration : EntityTypeConfiguration<Site> { 

public SiteConfiguration() { 
    HasMany(c => c.buildings) 
    .WithRequired() 
    .HasForeignKey(c => c.siteId); 
    } 
} 

在我的控制器MVC我只是想從網站中刪除建設。這裏是我的控制器代碼:

public ActionResult Delete(int id, int siteId) { 
    var site = repo.GetById(siteId); 
    var building = site.buildings.SingleOrDefault(c => c.id == id); 
    ou.buildings.Remove(site); 
    repo.Save(); 
} 

我的錯誤消息:

操作失敗:關係 不能被改變,因爲一個或 多個外鍵的屬性是 非空的。當更改爲 的關係時,相關的 外鍵屬性設置爲空值 值。如果外鍵沒有 支持空值,則必須定義新的 關係,必須將 外鍵屬性指定爲 另一個非空值,或必須刪除不相關對象 。任何 的想法或建議將是 非常感謝。

+0

您可以擴展您的代碼示例以包含'repo'和'ou'的定義嗎? – therealmitchconnors

回答

0

你可以嘗試和替換這一行:

public int siteId { get; set; } 

有了這個:

public Site site { get; set; } 

有描述與類名或ID的關係的兩種方式。你們結合起來,這就是爲什麼你們的關係已經存在。

+0

通過做這一切,我現在得到了一個不同的錯誤。 「Site_Buildings」AssociationSet中的關係處於「已刪除」狀態。考慮到多重性約束,相應的「Site_Buildings_Target」也必須處於「已刪除」狀態。 –

1

試試這個:

public class Building 
{ 
    public int id { get; set; } 
    public Site Site { get; set; } 
    ... 
} 

public class SiteConfiguration : EntityTypeConfiguration<Site> 
{ 
    public SiteConfiguration() 
    { 
     HasMany(c => c.buildings); 
    } 
} 

public BuildingConfiguration : EntityTypeConfiguration<Building> 
{ 
    public BuildingConfiguration() 
    { 
     HasRequired(s=>s.Site); 
    } 
} 

這告訴它可以有很多的建築現場,並告訴它需要一個網站的建設,不會使網站擔心的建設要求,反之亦然。

據我所知,你只在HasMany.WithMany/WithRequired中引入許多關係等。

+0

爲什麼建築必須瞭解該網站?我真的不希望這種關係存在,因爲我永遠不需要從建築物導航到網站,它始終是網站建設。\ –

+0

有趣的 - 我想它不會 - 但是那麼你會只有「HasMany」在沒有HasRequired的站點配置中(試圖將建築物連接到站點)。 –