簡體   English   中英

實體框架中的迭代錯誤

[英]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類都分別具有MessageUser的集合。

這樣的事情應該起作用:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM