【问题标题】:EntityCommandExecutionException - Trying to link 2 models in 1 database [duplicate]EntityCommandExecutionException - 尝试在 1 个数据库中链接 2 个模型 [重复]
【发布时间】:2016-12-16 19:09:45
【问题描述】:

我几乎有 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 中,我有这段代码,如果您查看此页面,请将每个公告标记为已看到但在“新看到”部分出现错误:

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();
        }
    }

【问题讨论】:

  • 当您遇到错误并询问有关该错误的问题时,您需要包含该错误。在这种情况下,它称为Exception这是错误在 .net 中的表现方式)。包括 Message、Type、StackTrace,并在 InnerExceptions 中一直递归地重复此操作。使用问题上的编辑链接包含该详细信息,不要将其作为评论包含在内。另请阅读How do I ask a Good Question

标签: c# asp.net asp.net-mvc model-view-controller


【解决方案1】:

事件如果你没有那个错误,你还有其他问题。见下文:

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() );

【讨论】:

  • 您好,感谢您的回复。我添加了:db.Seens.AddRange(seens); db.SaveChanges();但这仍然没有更新数据库,我很难过任何想法。
  • 你收到错误了吗?
  • 无,这与我看到的模型有关,因为看到的数据库包含:SeenId、Announcement_AnnouncementId 和 User_Id
  • 这取决于 SeenId 是什么。我看不出你的 dbcontext 代码很难说。但是是的,很可能是因为这个。
  • 我刚刚用我的 dbContext 编辑了它
【解决方案2】:

该错误是因为您正在积极地迭代从数据库流式传输的集合,然后尝试在该循环内重新向数据库发出另一个选择。它可以通过在使用 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

【讨论】:

  • 谢谢!底部的那个不起作用,但这不是我想要的,所以无论如何谢谢你。新问题是第二种方法没有出现任何错误,但没有记录添加到 seens 数据库中。
  • @PigeonMilkStories - 这是因为您没有将它们添加到DbContext,也没有在之后调用db.SaveChanges();。但很乐意提供帮助。
  • @PigeonMilkStories - 也请考虑接受答案(请参阅How to accept SO answers
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多