我收到以下错误:
类型'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();
}
}
}
}
非常感谢
答案 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的教程,详细解释这一点。