Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq Windows Phone SQL Server CE-检索要升级的基础数据库架构_Linq_Windows Phone 7_Linq To Sql_Sql Server Ce_Windows Phone - Fatal编程技术网

Linq Windows Phone SQL Server CE-检索要升级的基础数据库架构

Linq Windows Phone SQL Server CE-检索要升级的基础数据库架构,linq,windows-phone-7,linq-to-sql,sql-server-ce,windows-phone,Linq,Windows Phone 7,Linq To Sql,Sql Server Ce,Windows Phone,Windows Phone 7.1支持SQL Server CE和LINQ to SQL,以及通过DatabaseSchemaUpdate升级数据库 在其他平台上,我会阅读数据库模式表(例如,sys.objects),以查看当前模式并确定哪些表/列需要升级 在Windows Phone上不允许直接SQL访问的情况下,如何检索当前数据库架构?SQL Server CE仍然包括信息架构.表和信息架构.列表,但由于不允许直接SQL访问,访问它们有点棘手 但是,您可以创建一个映射到以下表的DataCon

Windows Phone 7.1支持SQL Server CE和LINQ to SQL,以及通过DatabaseSchemaUpdate升级数据库

在其他平台上,我会阅读数据库模式表(例如,
sys.objects
),以查看当前模式并确定哪些表/列需要升级


在Windows Phone上不允许直接SQL访问的情况下,如何检索当前数据库架构?

SQL Server CE仍然包括
信息架构.表
信息架构.列
表,但由于不允许直接SQL访问,访问它们有点棘手

但是,您可以创建一个映射到以下表的
DataContext

public class SchemaContext : DataContext
{
    public SchemaContext()
        : base("Data Source=isostore:/Database.sdf")
    {
        if (!this.DatabaseExists())
        {
            throw new InvalidOperationException("Cannot use the SchemaContext on a database which doesn't exist");
        }
    }

    public Table<Table> Tables;
    public Table<Column> Columns;

    [Table(Name = "INFORMATION_SCHEMA.Columns")]
    public class Column
    {
        [Column(Name = "TABLE_NAME")]
        public string TableName { get; set; }

        [Column(Name = "COLUMN_NAME")]
        public string Name { get; set; }

        [Column(Name = "DATA_TYPE")]
        public string DataType { get; set; }

        [Column(Name = "ORDINAL_POSITION")]
        public int OrdinalPosition { get; set; }

        [Column(Name = "IS_NULLABLE")]
        public string IsNullableString { get; set; }

        public bool IsNullable
        {
            get { return this.IsNullableString == "YES"; }
            set { this.IsNullableString = value ? "YES" : "NO"; }
        }

    }

    [Table(Name = "INFORMATION_SCHEMA.Tables")]
    public class Table
    {
        [Column(Name = "TABLE_NAME")]
        public string Name { get; set; }

        [Column(Name = "TABLE_TYPE")]
        public string Type { get; set; }
    }
}
为这些表创建单独的上下文很重要,否则,
DataContext.CreateDatabase
调用将尝试创建这些架构表,但会失败。

有一种方法提倡在
数据库架构更新上使用
数据库架构规避
-即:

//设置新的数据库版本。
DatabaseSchemaUpdater dbUpdater=db.CreateDatabaseSchemaUpdater();
dbUpdater.DatabaseSchemaVersion=APP\u版本;
dbUpdater.Execute();

您可以查询版本并添加在每个版本中添加的位,而不必担心当前的模式(毕竟,只要您记得正确更新版本号,它将是一个已知的配置)。

但即使有模式知识,您也无法添加任何表/列,因为您无法执行直接SQL代码。请参阅本演练如:演练:为Windows Phone更新本地数据库应用程序您可以使用
DatabaseSchemaUpdater
。我只需要通过
DatabaseSchemaUpdater
访问模式,找出需要添加的内容。但为什么不使用版本号呢?主要原因是,不必为每个版本增量手动添加数据库升级脚本。如果可以通过编程方式找到现有模式和目标模式,则可以自动升级。这意味着我只需要写一组代码,我就可以忘记它;应用程序将自行处理。我已经为iOS和Android做了这项工作,它就像一个魅力。
using (var schemaContext = new SchemaContext())
{
    foreach (var table in schemaContext.Tables)
    {

    }
}