2011-09-21 24 views
4

我正在構建ASP.NET MVC 3的一個論壇項目,它使用最新版本的實體框架在.NET 4上運行。實體框架4.1代碼優先,所需的延遲加載引用在保存時爲空

我平時的設計論壇,與分類一局,並與論壇,論壇主題與主題,並與文章等

分類簡化爲:

public class Category { 
    [Required] 
    public virtual Board Board { get; set; } 
} 
public class Forum { 
    [Required] 
    public virtual Category Category { get; set; } 
} 
public class Topic { 
    [Required] 
    public virtual Forum Forum { get; set; } 
} 
public class Post { 
    [Required] 
    public virtual Topic Topic { get; set; } 
} 

當創建一個新的崗位該主題被通知,並且當話題被改變時,論壇被通知。

所以,再次簡化:

public class Forum { 
    public void TopicChanged(Topic topic) { 
     // Do stuff 
    } 
} 
public class Topic { 
    public void PostAdded(Post post) { 
     // Do stuff 
     this.Forum.TopicChanged(this); 
    } 
} 

因此,創建一個新的帖子(和它提交到數據庫)後,我打電話PostAdded父話題。現在這是奇怪的地方!

當我對我的存儲庫提交更改時,出現驗證錯誤,需要論壇上的類別。

如果我查看數據庫,論壇會引用父類別。如果我停止代碼並查看Forum對象,它有一個Category實例。因此,這看起來像延遲加載的問題,特別是因爲如果我加入這一行:

var cat = this.Category 

在論壇類的TopicChanged方法的底部,不再有任何錯誤。

我在這裏做了些什麼完全錯誤的事情,我遇到了一個臨界問題,或者發生了什麼?我想EF會看到引用是一個懶加載的引用,如果它沒有改變,沒有理由爲什麼這會失敗保存?

感謝, 斯蒂恩

+0

EF禁用延遲加載時,它驗證。我記得[拉迪斯拉夫](http://stackoverflow.com/users/413501/ladislav-mrnka)已經給出了詳細的答案,但我找不到帖子。 – Eranga

+0

答案在這裏:http://stackoverflow.com/questions/7305144/lazy-deferred-loading-of-links-not-on-time –

+0

謝謝。我可以理解爲什麼,但這使我很難做到自己想做的事!開溜! –

回答

8

我已經解決我的問題。這可能不是一個非常好的和乾淨的解決方案,但至少我現在可以處理這種情況,而無需更改大量代碼(這也需要使用nHibernate來運行)。所以沒有髒解決方案。

只是給你一個關於它如何解決的想法,我會在這裏嘗試解釋它。

在我的存儲庫的Commit()方法上,我開始調用DbContext實例上的GetValidationErrors()。這將返回上面遇到的錯誤以及發生錯誤的實體。在這個實體的基類型上(實體是由EF生成的代理),我運行所有屬性,當我遇到一個帶有Required屬性的屬性時,我在代理對象上的相同屬性上調用GetValue。

少廢話,更多的代碼:

var errors = this.context.GetValidationErrors(); 
foreach (DbEntityValidationResult result in errors) { 
    Type baseType = result.Entry.Entity.GetType().BaseType; 
    foreach (PropertyInfo property in result.Entry.Entity.GetType().GetProperties()) { 
     if (baseType.GetProperty(property.Name).GetCustomAttributes(typeof(RequiredAttribute), true).Any()) { 
      property.GetValue(result.Entry.Entity, null); 
     } 
    } 
} 
+1

你是一個天才。 – friism

相關問題