实体框架错误:自创建数据库以来上下文已更改

时间:2014-02-10 20:45:56

标签: c# linq entity-framework

我收到以下错误:

  

类型'System.InvalidOperationException'的未处理异常   发生在EntityFramework.dll

中      

附加信息:支持'PrivateMessageContext'的模型   自创建数据库以来,上下文已更改。考虑使用   代码优先迁移以更新数据库   (http://go.microsoft.com/fwlink/

但为什么会改变?我想要的只是获取新消息,检查用户是否有以前的消息历史记录,并创建新的消息历史记录或附加他们的当前消息......

我正在尝试测试send方法,所以我想在每次添加新消息时打印出以前的消息

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;

namespace CodeFirstNewDatabaseSample
{
class Program
{
    static void Main(string[] args)
    {
            Console.Write("Enter message: ");
            var message = Console.ReadLine();
            var userFrom = "userFrom";
            var userTo = "userTo";
            Methods test = new Methods();
            for(var i=0; i < 10; i++)
            {
                test.StoreMessage(userTo, userFrom, message);
                Console.Write("Enter message: ");
                message = Console.ReadLine();
            }
    }
}
public class PrivateMessageContext : DbContext
{
    public DbSet<PrivateMessageHeader> PrivateMessages { get; set; }
}
public class PrivateMessageHeader
{
    public PrivateMessageHeader() { this.Messages = new List<PrivateMessageDetail>(); }
    public int PrivateMessageHeaderId { get; set; }
    public DateTime TimeStamp { get; set; } // Date of the start of thread
    public string User1 { get; set; }
    public string User2 { get; set; }  // this could be made to a list to allow multiples

    public ICollection<PrivateMessageDetail> Messages { get; set; }
}

public class PrivateMessageDetail
{
    public int PrivateMessageDetailId { get; set; }
    public DateTime MessageDate { get; set; }
    public string FromUser { get; set; } // Don't need ToUser, it's already in header
    public string Message { get; set; }

    public PrivateMessageHeader parent { get; set; }
}
public class Methods
{

    public void StoreMessage(string userTo, string userFrom, string InputMessage) 
    {
        using (var db = new PrivateMessageContext()) 
        {
            var collection = from pm in db.PrivateMessages select pm;
            foreach(var msg in collection)
            {
                var user1 = msg.User1;
                var user2 = msg.User2;
                if ( (user1==userTo && user2==userFrom) || (user1==userFrom && user2==userTo))
                {
                    var msgDetail = new PrivateMessageDetail();
                    msgDetail.FromUser = userFrom;
                    msgDetail.Message = InputMessage;
                    msgDetail.MessageDate = DateTime.Now;
                    msg.Messages.Add(msgDetail);
                    db.SaveChanges(); 
                    return;
                }
            }
            // pair doesn't exist

            var PrivateMessage = new PrivateMessageDetail();
            PrivateMessage.MessageDate = DateTime.Now;
            PrivateMessage.FromUser = userFrom;
            PrivateMessage.Message = InputMessage;
            var newCollection = new PrivateMessageHeader();
            newCollection.TimeStamp = DateTime.Now;
            newCollection.User1 = userTo;
            newCollection.User2 = userFrom;
            newCollection.Messages.Add(PrivateMessage);
            db.PrivateMessages.Add(newCollection); 
            db.SaveChanges();

            var iterator = 0;
            // Display all messages from the database 
            foreach (var pmsg in db.PrivateMessages)
            {

                var query = pmsg;
                var list = pmsg.Messages.ToList();
                foreach (var item in list)
                {
                    Console.WriteLine("msg" + iterator + ":  " + item.ToString());
                }
                iterator++;
            }
            Console.ReadKey();
       }      
   }
}

}

非常感谢

2 个答案:

答案 0 :(得分:0)

您是否尝试过Database.SetInitializer<PrivateMessageContext>(null);

尝试按如下方式更改您的上下文。

public class PrivateMessageContext : DbContext
{
    public DbSet<PrivateMessageHeader> PrivateMessages { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        Database.SetInitializer<PrivateMessageContext>(null);
    }

}

更多信息here

答案 1 :(得分:0)

我在此问题中使用的一个来源是VS2012中的软件包管理器控制台。通过使用Enable-Migrations命令以及EnableAutomaticMigations标志,然后将迁移信息添加到项目中,我可以使用任何不会“破坏”数据库或我的代码的代码优先模型更改来更新数据库。您不必手动将任何内容添加到项目中,这一切都是为您完成的。如果您忘记启用自动迁移,则可以在此过程中添加的配置文件中手动编辑此项。我相信这个过程自VS2008以来一直存在,但不要引用我的话。我从VS2010开始就使用过它,并且已经在MVC和MVVM中同时用于Web和桌面。我在MSDN上使用的文章之一是:http://msdn.microsoft.com/en-us/data/JJ591621.aspx,您还可以查找John Galloway的教程,详细解释这一点。