2016-12-16 74 views
-1

我有兩個模型 - 一個公告,其中有些人可以發佈公告和一個看到的模型,確定是否有人看到該公告。她EIS型號:EntityCommandExecutionException - 試圖鏈接1個數據庫中的2個模型

宣佈:

public class Announcement 
{ 
    public int AnnouncementId { get; set; } 
    public string AnnouncementContent { get; set; } 
    public virtual ApplicationUser User { get; set; } 
} 

,看到:

public class Seen 
{ 
    public int SeenId { get; set; } 

    public virtual Announcement Announcement { get; set; } 
    public virtual ApplicationUser User { get; set; } 
} 
在我AnnouncementController.Index

我有這樣的代碼,幾乎應該是,如果您查看此頁,標出每個公告如所見b但在「新看到」部分出現錯誤:

public ActionResult Index() 
{ 
    string currentUserId = User.Identity.GetUserId(); 
    var currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId); 


    if(db.Announcements != null) 
    { 
     foreach (Announcement anoun in db.Announcements) 
     { 
      new Seen 
      { 
       User = db.Users.Add(currentUser), 
       Announcement = db.Announcements.FirstOrDefault(x => x.AnnouncementId == anoun.AnnouncementId), 
      }; 
     } 
    } 
    return View(db.Announcements.ToList()); 
} 

已經有一個與此命令關聯的打開的DataReader,它必須先關閉。

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
    { 
     public ApplicationDbContext() 
      : base("DefaultConnection", throwIfV1Schema: false) 
     { 
     } 

     public DbSet<Announcement> Announcements { get; set; } 
     public DbSet<Comment> Comments { get; set; } 
     public DbSet<Seen> Seens { get; set; } 

     public static ApplicationDbContext Create() 
     { 
      return new ApplicationDbContext(); 
     } 
    } 
+0

當你有一個錯誤,你問一個有關該錯誤的問題,你需要包括該錯誤。在這種情況下,它被稱爲[Exception](https://msdn.microsoft.com/en-us/library/system.exception(v = vs.110).aspx)(*這是如何在.net中顯示錯誤*)。包括消息,類型,StackTrace,並在整個InnerExceptions中向下重複這個遞歸。使用您問題上的編輯鏈接來包含該詳細信息,不要將其作爲評論。另請閱讀[我如何提出一個好問題](http://stackoverflow.com/help/how-to-ask)。 – Igor

回答

0

這個錯誤是因爲你正在積極遍歷集合從數據庫流,然後嘗試重新發出另一個選擇到循環內的數據庫。可以通過在使用ToList()(其他選項也可用,如AsEnumerableToArray)進入循環之前強制集合的實現來解決該問題。

foreach (Announcement anoun in db.Announcements.ToList()) 
{ 
    new Seen 
    { 
     User = db.Users.Add(currentUser), 
     Announcement = db.Announcements.FirstOrDefault(x => x.AnnouncementId == anoun.AnnouncementId), 
    }; 
} 

這就是說我不確定你爲什麼這樣做。爲什麼不直接附加實例anoun,因爲您只使用單個(或顯示的代碼中的相同)DbContext實例(變量名稱爲db)。

foreach (Announcement anoun in db.Announcements) 
{ 
    new Seen 
    { 
     User = currentUser, // also this seemed wrong before, just assign the reference directly 
     Announcement = anoun 
    }; 
} 

或使其更簡單:

var newSeens = db.Announcements.Select(x => new Seen(){User = currentUser, Announcement = x}).ToList(); 
db.Seens.AddRange(newSeens); 
db.SaveChanges(); 

這假定用戶還沒有看到任何公告。如果用戶看到了一些,那麼您需要在該用戶的現有Seen記錄上過濾db.Announcements

+0

感謝您的支持!最下面的那個不起作用,但那不是我想要的,所以非常感謝你。新問題是我沒有得到第二種方法的任何錯誤,但沒有記錄被添加到seens數據庫。 –

+0

@PigeonMilkStories - 它是因爲你沒有將它們添加到'DbContext'中,也沒有在之後調用'db.SaveChanges();'。但很高興幫助。 – Igor

+0

@PigeonMilkStories - 也請考慮接受答案(請參閱[如何接受SO答案](http://meta.stackexchange.com/a/5235)) – Igor

0

事件如果您沒有該錯誤,您仍然有其他問題。見下:

public ActionResult Index() { 
string currentUserId = User.Identity.GetUserId(); 
var currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId); 

List<Seen> seens = new List<Seen>(); 
if(db.Announcements != null) { 
    foreach(Announcement anoun in db.Announcements) { 
     seens.Add(
     new Seen 
     { 
     User = currentUser, // You have this already so why go to the database again? 
     Announcement = anoun, // Same with this. 
     }); 

    } 
} 

// Save seens to the database 

return View(db.Announcements.ToList()); 
+0

嗨,謝謝你的回覆。我加入了: db.Seens.AddRange(seens); db。保存更改(); 但這仍然沒有更新數據庫,任何想法,因爲我難住。 –

+0

你有錯誤嗎? – CodingYoshi

+0

none,isit與我看到的模型,因爲看到的數據庫包含:SeenId,Announcement_AnnouncementId和User_Id –