通过Linq to Sql 在Windows Phone上创建数据库

Linq to sql是.NET 上的ORM类库。因此首先我们需要定义O(Object),此处我们定义如下类:


View Code
public class Code
    {
        public string Id { getset; }

        public string CodeTypeId { getset; }

        public string CodeExtensionId { getset; }

        public string CodeValue { getset; }

        public string DisplayText { getset; }


接下来就需要定义R(Relationship)和M(Mapping)

Linq to sql为我们提供两种方式来进行Relationship和Object(Class)的Mapping

1. Xml文件来描述对象与表之间的映射关系。

2. 在定义Class的时候采用Attribute直接定义其与表之间的映射。

此处采用第二种,使用起来更为简便明了。

View Code
[Table]
    public class Code
    {
        [Column(IsPrimaryKey = true, DbType = "int", CanBeNull = false, IsDbGenerated = true)]
        public string Id { getset; }

        [Column]
        public string CodeTypeId { getset; }

        [Column]
        public string CodeExtensionId { getset; }

        [Column]
        public string CodeValue { getset; }

        [Column]
        public string DisplayText { getset; }

O,R,M都定义好了。接下来就是将这个关系存储到特理数据库里面去了。

在Linq to sql中最重要的应该要数DataContext类了,他提供了访问数据库,表的一系列方法。

此处需要用到DataContext的CreateDatabase方法来创建数据库。

这里还遗留了一个问题,我们定义了类以及其与表的映射,但是我们还没有将表与数据库的关系表示出来。

Linq To Sql中是采用如下方法来实现:

1. 实现一个DataContext的派生类,然后将数据库中所有的表所关联的类型添加为派生类的如下形式的成员:public Table<Code> Codes;(不一定要为public)

2. 当创建数据库时,DataContext为找出派生类中所有Table<T>类形的成员,然后为每个成员所代表的类型创建其相应的表。

(关于这一点,我刚开始看MSDN的时候始终很疑惑。MSDN上的例子展示了做法,但是我始终找不到一个地方明确说明需要将所有数据表相关类型添加为DataContext派生类的成员,于是我也一直不敢确定事实是否如此。后来用Reflector看了DataContext的源码才确认确实如此。)

此处实现派生类如下:

View Code
public class Database : DataContext
    {
        private static AttributeMappingSource mappingSource = new AttributeMappingSource();
        public Database(string databaseFilePath)
            : base(databaseFilePath, mappingSource)
        {

        }

        public Table<Code> Codes;

这里又有一点疑惑,为什么声明了一个public的成员却没有任何初始化的代码。

其实这里我觉得又是MSDN上没有说明清楚的地方(也有可能是我没找到),在构造函数DataContext(string connection,MappingSource mappingSource)中。

DataContext会对派生类中每个Table<T>类型的成员进行赋值为Linq to sql在内存中维护的数据表的对象。

这样,当调用派生类的CreateDatabase()方法后,通过构造函数所指定的数据库文件会被创建,并且所有在派生类中声明的数据表也会在数据库中创建好。

DataContext还提供的接口来检查数据库是否已经存在,以及删除已存在的数据库。

View Code
Database db = new Database("code.sdf");
            if (db.DatabaseExists())
            {
                db.DeleteDatabase();
            }

接下来就可以去通过派生类中的数据表成员来访问数据表了。

posted @ 2012-10-06 02:13  self.refactoring  阅读(473)  评论(0)    收藏  举报