【问题标题】:Entity framework join 2 tables实体框架连接2个表
【发布时间】:2013-08-05 17:40:15
【问题描述】:

这里是实体框架和mvc的初学者。 我有 2 个表模型:

用户资料

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
}

聊天记录

[Table("ChatLogs")]
public class ChatLogs
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ChatLogId { get; set; }
    [Column("Message")]
    public string Message { get; set; }
    [Column("UserId")]
    public int UserId { get; set; }

    public override string ToString()
    {
        return "Person: " + Message + " " + UserId;
    }

}

ChatLogs 表中的 UserId 是 UserPorfile UserId 主键的外键。

我正在尝试在 Asp.NET MVC 4 中加入这两个表

经过测试的 SQL 查询:

select * from UserProfile as a join ChatLogs as b on a.UserId = b.UserId

经过测试的 Linq 查询:

from b in db.ChatLogs
select new {
  ChatLogId = b.ChatLogId,
  Message = b.Message,
  UserId = b.UserId,
  Column1 = (int?)b.UserProfile.UserId,
  UserName = b.UserProfile.UserName,
  Email = b.UserProfile.Email
}

我正在使用名为“Linqer”的软件进行学习。它将 SQL 转换为 Linq。

动作结果代码:

private ChatLogContext db = new ChatLogContext();
public ActionResult Index()
{
    var list = from b in db.ChatLogs
               select new
               {
                   ChatLogId = b.ChatLogId,
                   Message = b.Message,
                   UserId = b.UserId,
                   Column1 = (int?)b.UserProfile.UserId,
                   UserName = b.UserProfile.UserName,
                   Email = b.UserProfile.Email
                   };


    var vm = new ChatLogsViewModel { LogListString = string.Join("\n", list) };
    return View(vm);

}

ChatLogViewModel 在视图中只有一个用于打印列表的字符串变量。

但我得到一个错误:

'Chat.Models.ChatLogs' does not contain a definition for 'UserProfile' and no extension method 'UserProfile' accepting a first argument of type 'Chat.Models.ChatLogs' could be found (are you missing a using directive or an assembly reference?)

那么我是否必须以某种方式连接这 2 个实体,以便它们相互了解?

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    试试这个:

    [Table("UserProfile")]
    public class UserProfile
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        public string UserName { get; set; }
        public string Email { get; set; }
        **public virtual ICollection<ChatLogs> ChatLogs { get; set; }**
    }
    
    [Table("ChatLogs")]
    public class ChatLogs
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int ChatLogId { get; set; }
        [Column("Message")]
        public string Message { get; set; }
        [Column("UserId")]
        public int UserId { get; set; }
    
        **public virtual UserProfile UserProfile { get;set; }**
    
        public override string ToString()
        {
            return "Person: " + Message + " " + UserId;
        }
    
    }
    

    【讨论】:

    • 谢谢先生。这按预期工作。那么每次我想将实体相互连接时,我是否必须放置这些虚拟集合,或者是否有任何其他“自动生成”方式?我首先将其作为实体代码执行,因此如果实体之间存在外键,则不知道数据库是否首先自动放置这些虚拟集合。顺便说一句,我可以问你如何(在哪里)格式化这个由 2 个实体构建的字符串吗?我当前的打印是: { UserName = john, Message = combine } 例如,想格式化它。如果我加入多个实体,我在哪里做格式?谢谢先生。
    • 当我仅从 ChatLogs 实体 pastebin.com/TWv2ZLPC 查询时,这工作正常,因为我在使用格式的 ChatLogs 中覆盖了 ToString(),但是如何使用多个实体进行格式化?
    • 是的,这样你就知道哪个是导航属性。在这里查看更多信息:msdn.microsoft.com/en-us/data/jj713564.aspx
    • PS:如果是多对多关系,需要使用Fluent API:msdn.microsoft.com/en-us/data/jj591620.aspx
    • 感谢您的所有 cmets :) 顺便说一句,我设法像这样格式化我的 linq 查询:pastebin.com/M6kUWCig 并使用 ChatLogsViewModel 将其传递给 View。这是形成和传递的正确方法(最佳实践)吗?谢谢
    【解决方案2】:

    最简单的连接方式是将聊天日志作为列表提供给用户:

    [Table("UserProfile")]
    public class UserProfile
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        public string UserName { get; set; }
        public string Email { get; set; }
    
        public List<ChatLog> ChatLogs{ get; set;}
    }
    

    现在您可以执行以下操作:

    var users = Users.Include("ChatLogs");
    

    现在每个用户的聊天记录列表都将正确填写。

    【讨论】:

      猜你喜欢
      • 2017-01-29
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多