简体   繁体   English

实体框架-具有相同数据的两个人

[英]entity framework - two people with the same data

I want to map a two tables in entity framework 6 and need some help! 我想在实体框架6中映射两个表,并且需要一些帮助! It is for my chat application; 这是我的聊天应用程序; I need to map user conversations into the database. 我需要将用户对话映射到数据库中。 Both group and private messages. 群组消息和私人消息。 For this question however, if you help me with the private messaging mapping, I should hopefully work out the group by myself :) anyway.... 但是,对于这个问题,如果您能帮助我进行私人消息传递映射,则无论如何我还是应该独自解决该小组的问题:)。

Each user can talk to any other user. 每个用户都可以与任何其他用户交谈。 They however share the same data, which is where I am struggling a bit: how to set the keys to the exact same data without duplication. 但是它们共享相同的数据,这就是我在努力的地方:如何将密钥设置为完全相同的数据而不会重复。 This is what I have so far: * * EDIT - new code 这是我到目前为止的内容: * * 编辑-新代码 ** * ** ** * **

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;

namespace CodeFirstNewDatabaseSample
{
    static void Main(string[] args)
        {
            using(var db = new PrivateMessageContext()) 
            {
                Console.Write("Enter message: ");
                var message = Console.ReadLine();
                var userFrom = "userFrom";
                var userTo = "userTo";
                var messageDetail = new PrivateMessageDetail(MessageDate = DateTime.Now, FromUser = userFrom, message = message);
                var pm = new PrivateMessageHeader { User1 = userFrom, User2 = userTo, TimeStamp = DateTime.Now }; 
                pm.Messages.Add(messageDetail);
                db.PrivateMessages.Add(pm);
                db.SaveChanges();

                // Display all Blogs from the database 
                foreach(var pmsg in db.PrivateMessages)
                {
                    var query = pmsg;
                    Console.WriteLine(pmsg.Message);
                }
                Console.ReadKey(); 
        }
    }
}
public class PrivateMessage
{
    public int PrivateMessageId { get; set; }
    public string Message { get; set; }
    public DateTime TimeStamp { get; set; }

   // public int User1Id { get; set; }
    public virtual string user1 { get; set; }
   // public virtual User user1 { get; set; }
   public virtual string user2 { get; set; }
    //public int User1Id { get; set; }
   // public virtual User user2 { get; set; }
}
public class User
{
    public int UserId { get; set; }
    public string UserName { get; set; }
}
public class PrivateMessageContext : DbContext
{
    public DbSet<PrivateMessage> PrivateMessages { get; set; }
}
public class Send
{
 /*   void Send(userTo, userFrom, message) 
    {
        using (var db = new PrivateMessageContext()) {
            var query = from pm in db.PrivateMessages;
            foreach(var msg in pm)
            {
                var user1 = msg.user1;
                var user2 = msg.user2;
                if ( (user1==userTo && user2==userFrom) || (user1==userFrom && user2==userTo))
                {
                      msg.Message += message;
                      return;
                }
                else {
            // pair doesn't exist

                     var PrivateMessage = new PrivateMessage { user1 = userFrom; user2 = userTo; TimeStamp = DateTime.Now; Message = message; }; 
                     db.PrivateMessages.Add(PrivateMessage); 
                     db.SaveChanges(); 
                }
            }      
       }*/
}  

} }

I am now stuck on two things - how to make a callable class which checks if there is previous message history (the Send() ) and how to use the User username instead of strings... 我现在停留在两件事上-如何使可调用类检查是否有以前的消息历史记录(Send()),以及如何使用用户名而不是字符串...

Thank you 谢谢

* update 3 * * 更新3 *

        static void Main(string[] args)
        {
            using(var db = new PrivateMessageContext()) 
            {
                Console.Write("Enter message: ");
                var message = Console.ReadLine();
                var userFrom = "userFrom";
                var userTo = "userTo";
                var messageDetail = new PrivateMessageDetail(MessageDate = DateTime.Now, FromUser = userFrom, message = message);
                var pm = new PrivateMessageHeader { User1 = userFrom, User2 = userTo, TimeStamp = DateTime.Now, Message = messageDetail }; 
                db.PrivateMessages.Add(pm);
                db.SaveChanges();

                // Display all Blogs from the database 
                foreach(var pmsg in db.PrivateMessages)
                {
                    var query = pmsg;
                    Console.WriteLine(pmsg.Message);
                }
                Console.ReadKey(); 
        }
    }
}
public class PrivateMessageContext : DbContext 
{ 
    public DbSet<PrivateMessageHeader> PrivateMessages { get; set; } 
} 

What you probably want is some kind of master/detail. 您可能想要的是某种主/详细信息。 What you would do is create a PrivateMessageHeader type, and this would contain the participants in the private message. 您将要做的是创建一个PrivateMessageHeader类型,该类型将包含私人消息中的参与者。 Then you would have a PrivateMessageDetail type that would contain the actual messages. 然后,您将拥有一个包含实际消息的PrivateMessageDetail类型。 There would be a 1 to many association between Header and details. 页眉和详细信息之间将存在一对多的关联。

So something like this: 所以像这样:

public class PrivateMessageHeader {
    public PrivateMessageHeader() { Messages = new List<PrivateMessageDetail>; }
    public int PrivateMessageHeaderId {get;set;}
    public DateTime ThreadTime {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;}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM