2013-07-16 14 views
1

我試圖實現自制的橫幅系統,記錄視圖和點擊。幾乎所有的工作,除了當我打開一個頁面和RenderBanners()行動從部分視圖調用。它被稱爲如下:EF:從部分視圖調用時錯誤的關係?

_Layout.cshtml通過@Html.Partial("_Header")調用_Header.cshtml,然後在_Header.cshtml我通過@{ Html.RenderAction("RenderBanners", "Home"); }調用此操作。

RenderBanners行動:

 [AllowAnonymous] 
     public ActionResult RenderBanners() 
     { 
      var banners = bannerTimeRepository.ForcefulGetAll().ToList(); 

      try 
      { 
       foreach(var banner in banners) 
       { 
        bannerLogRepository.SaveOrUpdate(new BannerLog 
        { 
         Timestamp = DateTime.Now, 
         Action = BannerAction.View, 
         User = membership.LoggedUser, 
         Banner = banner 
        }); 
       } 
      } 
      catch(Exception ex) 
      { 
       var tralala = ex; 
      } 

      return View(banners); 

我得到這個InvalidOperationException異常:

的關係無法改變,因爲一個或多個外鍵的屬性是不可爲空。當對關係進行更改時,相關的外鍵屬性將設置爲空值。如果外鍵不支持空值,則必須定義新的關係,必須爲外鍵屬性指定另一個非空值,或者必須刪除不相關的對象。

這似乎是我的模型是不正確的,對吧?

好吧,如果我訪問~/Home/RenderBanners網址,我得到的一切正確渲染,一切都保存到數據庫局部視圖。 它還可以與此操作:

[AllowAnonymous] 
public ActionResult FollowBanner(int id) 
{ 
    var banner = bannerRepository.ForcefulGetById(id); 

    bannerLogRepository.SaveOrUpdate(new BannerLog 
    { 
     Timestamp = DateTime.Now, 
     Action = BannerAction.Click, 
     User = membership.LoggedUser, 
     Banner = banner 
    }); 

    return Redirect(banner.Href); 
} 

我的模型:

public abstract class Entity 
{ 
    [Key] 
    public int Id { get; protected set; } 
} 
public class Banner : Entity 
{ 
    //omited 
} 

public class BannerLog : Entity 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public new int Id { get; set; } 

    public BannerAction Action { get; set; } 

    public User User { get; set; } 

    public DateTime Timestamp { get; set; } 

    public Banner Banner { get; set; } 
} 

public enum BannerAction 
{ 
    View = 0, 
    Click = 1 
} 

模型構建器:

modelBuilder.Entity<BannerLog>().HasRequired(x => x.Banner).WithMany().WillCascadeOnDelete(true); 
modelBuilder.Entity<BannerLog>().HasOptional(x => x.User).WithMany().WillCascadeOnDelete(false); 

我相信我的模型和關係是正確的,因爲它的工作原理最的時間...除了通過部分視圖調用Action之外?我勒個去?

編輯:本工程採用倉庫百通,我們有一個接口IRepository <牛逼>和庫<牛逼>實施SaveOrUpdate是這樣的:

 public virtual T SaveOrUpdate(T entity) 
     { 
      var casted = entity as Entity; 
      if(casted.Id == 0) 
       this.Context.Set<T>().Add(entity); 

      this.Context.SaveChanges(); 

      return entity; 
     } 

bannerLogRepository只是庫<BannerLog>。

+0

'SaveOrUpdate'方法如何工作? –

+0

更新的原始問題。 @Vyacheslav Volkov – Lars

+0

你在哪裏設置「Banner」和「BannerLog」的ID? –

回答

0

因爲我仍然不知道這到底是怎麼回事,我去了一個快速的黑客 - 而不是做@{ Html.RenderAction("RenderBanners", "Home"); }我只是把這個行動從JavaScript:

<div id="bannerDiv"></div> 
<script> 
    $("#bannerDiv").load('@Url.Action("RenderBanners", "Home")'); 
</script> 

正常工作...