【问题标题】:SQL query to multiple objects using Entity Framework 6使用 Entity Framework 6 对多个对象进行 SQL 查询
【发布时间】:2019-03-06 05:37:50
【问题描述】:

我正在花时间学习 EF(特别是第 6 版)。

我在 MSSQL 中创建了两个表,并将 EF6 链接到创建 EF 模型框架的数据库。

然后我在代码中创建了这些类。我的愿望是用“UserDatas”的项目列表拉出一行(是的,我知道它拼写错误)。

考虑这段代码:

public class user
{
    [Key]
    public int pkID;
    public string ForeignCode;
    public string UserName;
    public virtual List<UserData> UserDatas { get; set; }
}

public class UserData
{
    [Key]
    public int pkID;
    public int fkUserID;
    public string ColumnName;
    public string ColumnValue;
}

class Program
{
    static TestData db = new TestData();

    static void Main(string[] args)
    {
        var record = db.tblUsers.Select(x => new { x.UserName, x.pkID }).FirstOrDefault();

        var record2 = db.tblUsers.Include(x => x.tblUserDatas).ToList();

        Console.ReadLine();
    }


}

第一个查询只是拉取 tblUsers 表中的主记录的测试。

第二个查询是我试图提取与该用户相关的所有字段,包括名字、姓氏、地址等...

当我在 Console.Readline() 上设置断点时会发生什么,我看到为 record2 列出了 5 行。 “用户”类在这些行中的每一行中都是重复的。我期待看到仅列出一次,其中包含“UserDatas”的项目列表。

如果一行包含“UserDatas”列表,我怎样才能让这个查询按预期通过?

同样,这仅用于学习目的,因此不必担心数据以及这是否是存储数据的最佳方式。

【问题讨论】:

    标签: c# entity-framework entity-framework-6


    【解决方案1】:

    它应该像下面这样简单(如果您不需要投影/匿名对象)并假设您的实体配置正确

    var user = db.tblUsers
                 .Include(x => x.UserDatas) // include user data
                 .FirstOrDefault(); // select the first user
    

    一些笔记,

    1. 不需要在表前加上tbl
    2. 不需要在字段前加上pkfk
    3. 如果使用Id,则无需指定[key]

    【讨论】:

    • 啊,FirstorDefault()。这让我很接近。如果我做一个“record2”。并滚动以在列表中查找 UserDatas 我没有看到它。但是当我在调试中观察数据时,我确实看到了数据。我是否在用户类对象中正确链接了用户数据?
    • @DaBlue 可能不是,您必须使用导航属性和 id 的标准命名或使用属性或流利的 api 来表示关系。大多数教程将展示如何做到这一点
    • 谢谢,迈克尔你帮了很多忙。删除表格上的 tbl 修复了从该对象的列表中选择的能力。
    • (类名要与表名一致)
    猜你喜欢
    • 2015-11-09
    • 2014-03-15
    • 2019-08-27
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多