【问题标题】:Read object from c# database into classes directly将 c# 数据库中的对象直接读入类中
【发布时间】:2017-08-30 08:47:20
【问题描述】:

我要做的是逐行读取数据库,并使用每行中的数据来初始化数据表示的类型的对象。在这种情况下,我正在读取 Device 表的行并尝试使用该数据创建 Device 对象。我看到了这个SO link

我尝试了这个 sn-p:

     using(var dc = new DataContext(connectionString)) 
     {
              List<Person> people = dc.ExecuteQuery(@"
              SELECT Id, Name Address
              FROM [People]
              WHERE [Name] = {0}", name).ToList(); // some LINQ too
     }

但它告诉我

无法从用法中推断出此用法的类型参数

这原则上是正确的还是我应该使用 BondIO 序列化器/解串器?如上所述here

另外,对象中成员的顺序可能与数据库中列的顺序不一样,这有关系吗?

当天晚些时候......

我现在有一个 DBContext,我的所有数据库对象都是这样定义的:

    public class MyContext : DBContext
    {
            public dbSet<Device>{ get; set;}
            etc...
    }

我现在尝试使用这个 sn-p 获取对象:

    using (var db = new MyContext(ConnectionString))
        {
            var res = db.Device.Find(ID);
        }

但是这会给出异常消息

无法加载类型'System.Data.Entity.ModelConfiguration.Conventions.AttributeToColumnAnnotationConvention`2

我检查了数据库,它应该根据我传递的 PrimaryKey ID 返回 1 个值。任何人都有任何提示我仍然做错了什么。

【问题讨论】:

    标签: c# sql entity-framework serialization


    【解决方案1】:

    你不能,因为 ExecuteQuery 是用于执行语句,而不是用于查询数据库。您应该改用 SqlQuery 您可以做的是,使用您要在查询中设置的属性创建一个新类,这意味着您的查询的简化版本。你的情况

    public class Device
    {
      public int  Id {get;set} 
      public string  Name {get;set} 
      public string  Address {get;set}
    }
    

    然后将其用作

    var people = dc.ExecuteQuery<Device>(@"
                  SELECT Id, Name Address
                  FROM [People]
                  WHERE [Name] = {0}", name).ToList();
    

    【讨论】:

    • 但是如果我已经有了 Device 类,并且它的成员像你刚才那样定义,为什么我不能查询所有列并将它们直接加载到 Device 对象中?
    • 我很抱歉 - 我的答案是错误的。我正在纠正它。
    • 你的意思是ExecuteCommand吗?? DataContext.SqlQuery 似乎不存在....
    • 对不起——我想我完全错了。我实际上指的是实体框架的 DBContext。使用 DataContext 它应该是 ExecuteQuery
    • 绝对有一个简单的解决方案可以做到这一点,我在之前的一个项目中看到过,但我现在不记得了......当我找到它时会回答这个问题跨度>
    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    相关资源
    最近更新 更多