c#ado.net:将数据库字段映射到属性的最佳方法

时间:2009-08-25 19:18:46

标签: c# ado.net

使用VS2005,.net 2.0,C#

大家好,

将存储的proc列映射到c#对象属性而不创建紧耦合的最佳方法是什么。

例如,我不想做以下

DataRow row = Getmyrows();
MyObject.MyProperty1 = row["col1"];
MyObject.MyProperty2 = row["col2"];

因此,当存储过程中的列变为colxyz时,二进制代码将中断。解决这个问题的最佳做法是什么?代码示例会有所帮助,并提前感谢您。

5 个答案:

答案 0 :(得分:1)

我会研究OR mappers。 LINQ to SQL,nHibernate,Entity Framework,LLBLGen等。这些允许您通过XML或其他一些外部配置源配置映射。它们中的大多数还提供了一种将实体与持久性框架完全分离的方法,允许您的实体成为POCO(普通旧CLR对象)。 OR映射器的另一个好处是它们可以为您动态生成SQL,这使您可以在很大程度上消除存储的proc层,这也是一种可能导致问题的耦合(在代码和代码中都存在...数据库架构。)

答案 1 :(得分:1)

夫妻方法:

  1. 如果您强制坚持使用ADO.NET,请使用strongly typed dataset。对象和数据结构之间的所有映射都在它所属的模式中。然后你就可以用这样的代码来保湿你的物体:

    MyObject.MyProperty1 = dataSet.TableName.PropertyName

  2. 我注意到其他人都说了同样的事情;-)去了一个ORM。我知道过早优化是一个滑坡,但你不可避免地会找到明确的理由走这条路。随着您的要求变得更加复杂,您将不会后悔,并且您将学习一种有价值的技能组合,这显然在.NET领域获得了很大的发展势头。

答案 2 :(得分:0)

最佳解决方案是使用适当的O / RM,如NHibernate,或者如果你能满足于“少”Linq to SQL或Entity Framework。

但是,如果必须,我建议使用IDataReader / SqlDataReader(最简单,最佳性能),但是如果你想以“艰难的方式”做到这一点,你就不必放弃映射到列名。

答案 3 :(得分:0)

我和同事在2.0天内使用过的方法是创建一个自定义属性,我们用它来指定数据表中的字段名称,并用它标记对象的属性。然后构建一个通用实体构建器,将datareader作为参数(EntityBuilder(IDataReader rdr));当它通过datareader工作时,它将创建一个空T,反映在类上,遍历属性以获取自定义属性信息和类型,并根据该值设置值。

还有另一个自定义属性,它指定了我们的插入和更新SPROC中使用的参数,以自动填充参数。

答案 4 :(得分:-2)

如果必须这样做,并且不想使用ORM,请将列名映射存储在xml文件中。

<appSettings>
    <key="prop1" value="col1">
</appSettings>

然后在代码中执行类似的操作:

myObject.Prop1 = ConfigurationManager.AppSettings["prop1"].Value

我知道它很笨重,并且涉及从xml(或配置文件)中读取每个属性,但它会起作用。