【发布时间】:2017-08-27 18:33:05
【问题描述】:
我正在使用 C# Winforms 创建一个简单的消息传递应用程序。我正在连接到在我的计算机上运行的 SQLEXPRESS 服务器并将所有内容存储在那里。
这是我的架构:
public class UserContext : DbContext {
public UserContext() : base("name=BuddyDatabase") {
}
public DbSet<User> Users { get; set; }
public DbSet<Message> Messages { get; set; }
}
public class User {
[Key]
public string username { get; set; }
public string password { get; set; }
public static implicit operator User(bool v) {
throw new NotImplementedException();
}
public virtual List<User> friends { get; set; }
}
public class Message {
[Key]
public int ID { get; set; }
public virtual User sender { get; set; }
public virtual User recipient { get; set; }
public string content { get; set; }
public virtual List<User> group { get; set; }
}
很简单
向单个收件人发送消息有效,但群组消息无效,每当我打开“消息屏幕”时,我都会收到此错误:
无法创建“WindowsFormsApp1.User”类型的常量值。此上下文仅支持原始类型或枚举类型。
这是我在消息屏幕加载时运行的方法:
var x = db.Messages.Where(b => b.recipient.username == currentuser.username);
foreach (var y in x) {
MainMessagesBox.Text += y.content;
}
x = null;
var z = db.Messages.Where(b => b.group.Contains(currentuser));
foreach (var y in z) {
MainMessagesBox.Text += y.content;
}
(Visual Studio 突出显示此行中的“in”作为错误原因。)
foreach (var y in z) {
认为这可能是我使用 Where 方法并涉及非基元(如错误消息所示)的问题,因此我尝试更改我的架构,以便该组是包含预期收件人的用户名的字符串列表和相应地修改了方法,但这也不起作用。将根据要求提供该试验的代码和错误。
这是实际的“发送消息”代码:
if (!textBox1.Text.Contains(',')) {
db.Messages.Add(new Message { sender = currentuser, recipient = db.Users.Find(textBox1.Text), content = currentuser.username + ": " + ContentBox.Text + "\n" });
db.SaveChanges();
} else {
List<User> recips = new List<User>();
string[] poop = textBox1.Text.Split(',');
foreach (var x in poop) {
recips.Add(db.Users.Find(x));
}
db.Messages.Add(new Message { sender = currentuser, group = recips, content = ContentBox.Text });
db.SaveChanges();
}
poop 是一个由文本框中的逗号分隔的预期收件人数组,这是临时的。
抱歉,如果有任何格式错误或我不清楚,这是我的第一个问题。
提前谢谢你。
【问题讨论】:
-
您应该在 Messages 表中为“sender”和“recipient”定义一个外键 - ref msdn.microsoft.com/en-us/library/jj713564(v=vs.113).aspx
-
如果我理解正确,一条消息要么发送给单个收件人,要么发送给一个组。但是你不应该在你的数据库中区别对待它。一封邮件要么在收件人列表中有多个收件人,要么只有一个。
标签: c# sql .net winforms entity-framework