天天看点

[WP8本地数据库01]班级管理-创建数据库

WP8的本地数据库是面向对象型的数据库,所以他的表就是一个实现了System.ComponentModel.INotifyPropertyChanged和System.ComponentModelINotifyPropertyChanging接口,并标识System.Data.Linq.Mapping. TableAttribute特性的类

下面是一个班级表

1 /// <summary>
 2 /// 班级表
 3 /// </summary>
 4  [System.Data.Linq.Mapping.Table]
 5  public class Class:INotifyPropertyChanged, INotifyPropertyChanging
 6  {
 7          public event PropertyChangingEventHandler PropertyChanging; 
 8  
 9          public event PropertyChangedEventHandler PropertyChanged;
10 }      

然后给班级表增加“编号”、“学年”、“班主任”,“序号”这几个字段

字段是通过定义标识System.Data.Linq.Mapping. ColumnAttribute的属性作为表的字段,并且要调用PropertyChanging,和PropertyChanged事件

对于Column特性,我要会经常设置的内容:

DbType:获取或设置数据库列的类型。

IsPrimaryKey:获取或设置一个值,该值指示该类成员是否表示作为表的整个主键或部分主键的列。

CanBeNull:获取或设置一个值,该值指示列是否可包含 null 值。

IsDbGenerated:获取或设置一个值,该值指示列是否包含数据库自动生成的值。

比如我要设置一个不自增、不为空的char(5)类型主键:

private string _ID;
        /// <summary>
        /// 属性的注释
        /// </summary>
        [Column(AutoSync=AutoSync.OnInsert, IsDbGenerated=false, CanBeNull=false, DbType="char(5)")]
        public string ID
        {
            get { return this._ID; }
            set
            {
                if (this._ID != value)
                {
                    NotifyPropertyChanging();
                    this._ID = value;
                    NotifyPropertyChanged();
                }
            }
        }
           

更多DbType的相关信息请访问:http://msdn.microsoft.com/zh-cn/library/system.data.linq.mapping.columnattribute.dbtype(v=vs.110).aspx

有关Column的其他内容,请访问http://msdn.microsoft.com/zh-cn/library/system.data.linq.mapping.columnattribute_properties(v=vs.110).aspx

一个完整的班级表

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data.Linq.Mapping;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;

namespace WP8DBStudy.DB
{
    /// <summary>
    /// 班级表
    /// </summary>
    [System.Data.Linq.Mapping.Table]
    public class Class:INotifyPropertyChanged, INotifyPropertyChanging
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public event PropertyChangingEventHandler PropertyChanging;

        private void NotifyPropertyChanging([CallerMemberName] String propertyName = "")
        {
            if (PropertyChanging != null)
            {
                PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
            }
        }

        private int _OrderBy;
        /// <summary>
        /// 序号
        /// </summary>
        [Column(IsDbGenerated=true)]
        public int OrderBy
        {
            get { return this._OrderBy; }
            set
            {
                if (this._OrderBy != value)
                {
                    NotifyPropertyChanging();
                    _OrderBy = value;
                    NotifyPropertyChanged();
                }
            }
        }

        private string _ID;
        /// <summary>
        /// 属性的注释
        /// </summary>
        [Column(AutoSync=AutoSync.OnInsert, IsDbGenerated=false, CanBeNull=false, DbType="NCHAR(5)")]
        public string ID
        {
            get { return this._ID; }
            set
            {
                if (this._ID != value)
                {
                    NotifyPropertyChanging();
                    this._ID = value;
                    NotifyPropertyChanged();
                }
            }
        }

        private string _Grade;
        /// <summary>
        /// 学年
        /// </summary>
        [Column]
        public string Grade
        {
            get { return this._Grade; }
            set
            {
                if (this._Grade != value)
                {
                    NotifyPropertyChanging();
                    this._Grade = value;
                    NotifyPropertyChanged();
                }
            }
        }

        private string _HeadTeacher;
        /// <summary>
        /// 班主任
        /// </summary>
        [Column]
        public string HeadTeacher
        {
            get { return this._HeadTeacher; }
            set
            {
                if (this._HeadTeacher != value)
                {
                    NotifyPropertyChanging();
                    this._HeadTeacher = value;
                    NotifyPropertyChanged();
                }
            }
        }

    }
}
           

创建了表类,我们还没能直接使用,在WP8中是通过DataContext类的子类来作为一个代理类操作数据库的

public class DBContext : DataContext
    {
        public const string CONNET_STR = "Data Source='isostore:/db.sdf';Password='111111'";

        public DBContext()
            : base(CONNET_STR)
        {
        }

        public Table<ClassTable> ClassTable;
    }
           

类型为Table<T> 的公开字段就是表对象,字段名和类型名一样(不一样需要另外配置,暂不说)

数据库的链接字符串格式是:

Data Source='isostore:/<文件名>';Password='<密码>'
           

 在App.xaml.cs文件的构造函数中使用如下代码创建数据库

using (DB.DBContext db = new DB.DBContext())
{
    //不存在数据库的时候才创建新数据库,注意,如果修改了数据库的话,需要删除重新创建数据库
    if (db.DatabaseExists() == false)
    {
        db.CreateDatabase();
    }
}
           

下班了,今天就写创建数据库好了,接下来还有操作数据库,要注意的事项和高级应用(比如表间关系的设置),最终会完成一个辅助管理班级的app。