2017-04-03 7 views
0

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は、エラーの原因として、この行の「中」を強調しています。)

のforeach {

私は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が、これは一時的なものであり、テキストボックスからコンマによって分離された受信者の配列です。

申し訳ありません何か書式が間違っているかわかりませんが、これは私の最初の質問です。

ありがとうございます。

+0

Messagesテーブル(「https://msdn.microsoft.com/en-us/library/jj713564(v=vs.113).aspx – Bitmask

+0

」の「送信者」と「受信者」の外部キーを定義する必要があります。私が正しく理解している場合、メッセージは単一の受信者またはグループに送信されます。しかし、あなたのデータベースでそれを別々に扱うべきではありません。受信者リストに複数の受信者があるメッセージ、または受信者リストに1つしかないメッセージがあります。 – sbecker

答えて

1

問題は、現在のユーザーがgroupのリストに含まれているかどうかをチェックする、メッセージの選択クエリテーブルです。クエリはデータベースに送信するためにSQLに変換する必要があるため、これは機能しません。

SQLは、「ユーザー」タイプが参照と比較できないことを理解していません。そして、実際には、どちらもC#はこれを適切に比較しません。あなたのケースで同じusernameの'User 'タイプの2つのオブジェクトは同じではありません。これらのオブジェクトのユーザー名を比較する必要があります。

ビットマスクはコメントに説明されているように、メッセージの外部キーを適切に定義する必要があります。

メッセージを送信するのは簡単です。 Userクラスにpublic virtual ICollection<Message> Messages { get; set; }があります。

しかし、受信者にとっては、多対多の関係です。だから、Userクラスとクラスの両方のコレクションは、それぞれMessageUserのコレクションを持っています。このような

何か作業をする必要があります。データの注釈や流暢なAPIを使用していずれかの多対多の関係を定義する方法の例

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; } 
} 

チェックthis linkを。これはあなたがEF6を使っていると仮定しています。 EFの古いバージョンを使用している場合は、多対多の関係を得るために結合テーブルを自分で定義する必要があります。

そして、クエリについては。あなたのメッセージ画面のOnLoadメソッドで次のように使用することができます。

MainMessagesBox.Text = string.Join(System.Environment.NewLine, currentuser.ReceivedMessages.Select(m => m.content)) 

これは改行で区切られたすべてのメッセージを、連結します。

+0

あなたが私に与えたスキーマを実装しましたが、今はすべてをスムーズにしようとしていますが、私のテーブルのいずれの行も削除できません。私は何かを削除しようとすると、外部キーの制約エラーが発生します。これはおそらくノブの間違いですが、助けてください。 – BaronessLover