[英]Iteration error in Entity Framework
我正在使用C#Winforms創建一個簡單的Messaging應用程序。 我正在連接到計算機上運行的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(z中的y){
我以為這可能是我使用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是由文本框中的逗號分隔的預期收件人的數組,這是臨時的。
抱歉,如果格式錯誤或不清楚,這是我的第一個問題。
先感謝您。
問題是在消息表上選擇查詢,您在其中檢查當前用戶是否在group
列表中。 這將不起作用,因為查詢必須轉換為SQL才能發送到數據庫。
SQL無法理解“用戶”類型是什么,因此無法比較引用。 實際上,C#都沒有對此進行正確比較。 在您的情況下,具有相同username
兩個“ User”類型的對象將不相等。 您需要比較那些對象的用戶名。
無論如何,正如Bitmask在評論中解釋的那樣,您必須正確定義消息的外鍵。
發送消息的人很容易。 您有一個public virtual ICollection<Message> Messages { get; set; }
public virtual ICollection<Message> Messages { get; set; }
public virtual ICollection<Message> Messages { get; set; }
在您的User
類中。
但是對於接收者來說,這是一個多對多的關系。 因此, User
類和Message
類都分別具有Message
和User
的集合。
這樣的事情應該起作用:
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 ICollection<Message> SentMessages { get; set; }
public virtual ICollection<Message> ReceivedMessages { get; set; }
public virtual List<User> friends { get; set; }
}
public class Message {
[Key]
public int ID { get; set; }
public virtual User Sender { get; set; }
public virtual ICollection<User> Recipients { get; set; }
public string content { get; set; }
}
查看此鏈接,獲取有關如何使用數據注釋或流利的API定義多對多關系的示例。 前提是您使用的是EF6。 如果您使用的是EF的舊版本,則可能必須自己定義聯接表才能獲得多對多關系。
至於查詢。 您可以在消息屏幕的OnLoad方法中使用以下命令:
MainMessagesBox.Text = string.Join(System.Environment.NewLine, currentuser.ReceivedMessages.Select(m => m.content))
這會連接所有消息,並用新行分隔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.