什么是建模我的SQL表类的好方法?

时间:2015-03-18 02:05:21

标签: c# design-patterns

我正在尝试检索具有多个列的表,并且我创建了一个类,该类能够将每一行表示为具有属性的对象。

E.G。

class TableA {
   int prop1;
   int prop2;
   ....
} 

我正在使用SqlDataReader读取每行的值,然后将其分配给我创建的对象

TableA tab = new TableA()
tab.prop1 = sqlreader.GetValue(prop1_ordinal).toString();

目前我需要明确说明:

tab.prop1 = etc2.. 
tab.prop2 = etc2...

当我有很多属性(20+左右)时,这可能会非常麻烦。

我应该使用哪些其他替代品?

我正在考虑使用词典或类似的东西,但我不知道如何开始。这样,我可以使用foreach循环遍历所有属性的列表并设置值。

基本上,我不想仅仅为了设置值而添加太多的冗余代码。

在将所有数据放入对象后,我将基本上在操作和更改值后将其写入CSV文件。

任何想法都会受到赞赏吗?

4 个答案:

答案 0 :(得分:2)

您是否尝试过使用linq生成表格&架构:

[Table(Name = "Test")]
public class TableA
{
    [Column(IsPrimaryKey = true)]
    public int ID { get; set; }

    [Column]
    public int prop1 { get; set; }

    [Column]
    public int prop2 { get; set; }
}

static int main()
{
    var constr  =   @" Data Source=NOTEBOOK\SQLEXPRESS;Initial Catalog=DemoDataContext;Integrated Security=True " ;
    var context  =   new  DataContext(constr) { Log  =  Console.Out };
    var metaTable  =  context.Mapping.GetTable( typeof (TableA));

    var typeName  =   " System.Data.Linq.SqlClient.SqlBuilder " ;
    var type  =   typeof (DataContext).Assembly.GetType(typeName);
    var bf  =  BindingFlags.Static  |  BindingFlags.NonPublic  |  BindingFlags.InvokeMethod;
    var sql  =  type.InvokeMember( " GetCreateTableCommand " , bf,  null ,  null ,  new [] { metaTable });
        Console.WriteLine(sql);
         // Excute SQL Command 
}

确保包含System.Data.Linq和:

using System.Data.Linq.Mapping;
using System.Data.Linq;
using System.Reflection;

您可以在以下位置找到更多信息: https://msdn.microsoft.com/en-us/library/bb384396.aspx

一旦映射完所有内容,您就可以使用linq函数为对象填充对象,将数据导入到对象中!

一个例子: https://social.msdn.microsoft.com/Forums/en-US/2bdfdde6-596e-4880-a3b3-3cb3ec365245/could-i-use-linq-to-sql-create-table-in-my-database?forum=linqtosql

答案 1 :(得分:0)

EntityFramework是为这样的事物设计的ORM(对象关系映射器)。它非常适合企业级产品,但如果你有一个较小的项目,它会非常庞大​​和笨重。 Dapper是一种超轻量级的ORM,基本上可以做到 tab.prop1 = sqlreader.GetValue(prop1_ordinal).toString(); 如果您将属性命名为与列名称相同,则为您提供部分。你用NuGet把Dapper拉进来。以下代码将为您提供对象的IEnumerable(TModel)。

        IEnumerable<TModel> result;
        using (MySqlConnection conn = new MySqlConnection(_mysqlConnString))
        {
            // "Query" is a Dapper extension method that stuffs the datareader into objects based on the column names
            result = conn.Query<TModel>("Select * from YourTable");
        }
        // do stuff with result

这链接到一个完整的示例,而不仅仅是我从当前项目中提取的部分。 http://www.tritac.com/bp-24-dapper-net-by-example

答案 2 :(得分:0)

您所描述的问题是我们使用对象关系映射器(ORM)的主要原因之一。最容易用于Microsoft SQL Server的可能是Linq2Sql,但实体框架允许您使用其他数据库引擎,并允许您定义更复杂的关系。另一个固体ORM是NHibernate。

答案 3 :(得分:0)

如果您发现EntityFramework变得庞大而笨重,您可以尝试Trinity Framework它是一个小型数据库,第一个带有T4模板的ORM框架和智能映射到您的数据库。

金块:PM&gt;安装包TrinityFramework