将数据集序列化为强类型业务对象属性

时间:2009-11-14 03:01:06

标签: c# .net vb.net orm dataset

在vb .net winforms应用程序中,我正在为记录中的“宽而浅”的孩子尝试一些东西。我使用强类型业务对象(Strataframe)。

我的计划是在表格中放置的数据集中收集一些“子表”。它们在持久化数据中没有对应关系,因此数据集是无类型的,我通过表的属性表创建模式。每个表都是接口中datagridview的数据源。

在我的概念验证示例中,我的主要业务对象(CustomerBO)与SQL Server 2008表交互,其中包含字段 - pk,name,和第三列,当前我认为是XML,但是可能只是作为varchar(max)如果对于保存序列化数据集更有效,则容易为varbinary(max)。

bo.bigfield将是我想要保存byte()数组或XML的强类型prop,或者代表该记录的数据集的任何东西。

因此,问题简而言之 - 如何将数据集转换为单个数据并从该数据中重现数据集。这是我第一次涉足数据集,datagridviews,所以如果有更好的方法可以实现我正在聆听的任何内容。

非常感谢代码和建议 - vb或C#

1 个答案:

答案 0 :(得分:0)

切片和骰子有很多种方法。你所说的是对象关系映射。有很多工具/框架,这是我的最爱:

对于快速应用程序开发,SubSonic是我最喜欢的。使用最新的3.x版本,您所要做的就是创建一个连接字符串,调用SubSonic持久层,并传入您的对象。它将创建用于在DB中持久保存对象的DDL,而不必真正地使用那些东西。这是SubSonic的一个例子:

    public class BaseDAO
    {
        private const String CONNECTION_STRING = "Repository";
        private static BaseDAO dao = new BaseDAO();
        private SimpleRepository repository;

        protected BaseDAO()
        {
            if (repository == null)
            {
                repository = new SimpleRepository(CONNECTION_STRING, SimpleRepositoryOptions.RunMigrations);
            }
        }

        public BaseDAO Instance()
        {
            return dao;
        }

        public SubSonic.Repository.SimpleRepository Repository
        {
            get { return this.repository; }
            set { this.repository = value; }
        }
    }

public class ProductDAO : BaseDAO
{
    public void save(ProductVO product)
    {
        if (product != null)
        {
            if (product.ID == null)
            {
                product.ID = Guid.NewGuid();
            }

            this.Repository.Add<ProductVO>(product);
        }
        else
        {
            throw new ArgumentException("The product passed in was null!");
        }
    }

    public void update(ProductVO product)
    {
        if (product != null)
        {
            this.Repository.Update<ProductVO>(product);
        }
        else
        {
            throw new ArgumentException("The product passed in was null!");
        }
    }

    public List<ProductVO> fetchAll()
    {
        return fetchAll(null);
    }

    public List<ProductVO> fetchAll(String name)
    {
        IEnumerable<ProductVO> list = this.Repository.All<ProductVO>();

        if (name != null && name.Length > 0)
        {
            var output =
                from products in list
                where products.Name.ToLower().Contains(name.Trim().ToLower())
                select products;

            list = output.ToList();
        }

        return list.OrderBy(product => product.Name).ToList();
    }

    public ProductVO fetchByID(object ID)
    {
        return this.Repository.Single<ProductVO>(ID);
    }

    public void delete(ProductVO product)
    {
        this.Repository.Delete<ProductVO>(product.ID);
    }
}

就这么简单。