我試圖實現自制的橫幅系統,記錄視圖和點擊。幾乎所有的工作,除了當我打開一個頁面和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>。
'SaveOrUpdate'方法如何工作? –
更新的原始問題。 @Vyacheslav Volkov – Lars
你在哪裏設置「Banner」和「BannerLog」的ID? –