C# windows phone中的数据库、表和列

C# windows phone中的数据库、表和列,c#,database,windows-phone-7,multiple-columns,C#,Database,Windows Phone 7,Multiple Columns,我在WindowsPhone7.1中有一个应用程序,其本地数据库sdf位于独立文件中。 现在,在我的当前版本中,我有以下表格: [Table] public class Employee { [Column(IsPrimaryKey = true)] public string EmployeeFile { get; set; } [Column(CanBeNull = false)] public string E

我在WindowsPhone7.1中有一个应用程序,其本地数据库sdf位于独立文件中。 现在,在我的当前版本中,我有以下表格:

[Table]
public class Employee
{
    [Column(IsPrimaryKey = true)]
    public string EmployeeFile
    {
        get;
        set;
    }
    [Column(CanBeNull = false)]
    public string EmployeeName
    {
        get;
        set;
    }
    [Column(CanBeNull = false)]
    public string EmployeeByte
    {
        get;
        set;
    }
}
在下一个版本的应用程序中,我想再添加两列,如下所示:

[Table]
public class Employee
{
    [Column(IsPrimaryKey = true)]
    public string EmployeeFile
    {
        get;
        set;
    }
    [Column(CanBeNull = false)]
    public string EmployeeName
    {
        get;
        set;
    }
    [Column(CanBeNull = false)]
    public string EmployeeType
    {
        get;
        set;
    }
    [Column(CanBeNull = false)]
    public string EmployeeExtn
    {
        get;
        set;
    }
    [Column(CanBeNull = false)]
    public string EmployeeByte
    {
        get;
        set;
    }
}
然后,如果我更改了表的代码,则在进行查询时应用程序会崩溃。 如果数据库中不存在这两个列,如何添加这两个列

我尝试了以下代码来更新我的数据库:

 using (Connection Empdb = new Connection(constant.strConnectionString))
            {
                if (Empdb.DatabaseExists())
                {
                    DatabaseSchemaUpdater dbUpdater = Empdb.CreateDatabaseSchemaUpdater();
                    // Add the column
                    try { dbUpdater.AddColumn<string>("EmployeeFile"); dbUpdater.Execute(); }
                    catch { /* Nothing */ }
                    try { dbUpdater.AddColumn<string>("EmployeeName"); dbUpdater.Execute(); }
                    catch { /* Nothing */ }
                    try { dbUpdater.AddColumn<string>("EmployeeType"); dbUpdater.Execute(); }
                    catch { /* Nothing */ }
                    try { dbUpdater.AddColumn<string>("EmployeeExtn"); dbUpdater.Execute(); }
                    catch { /* Nothing */ }
                    try { dbUpdater.AddColumn<string>("EmployeeByte"); dbUpdater.Execute(); }
                    catch { /* Nothing */ }
                }
            }
使用(Connection Empdb=新连接(constant.strConnectionString))
{
if(Empdb.DatabaseExists())
{
DatabaseSchemaUpdater dbUpdater=Empdb.CreateDatabaseSchemaUpdater();
//添加列
请尝试{dbUpdater.AddColumn(“EmployeeFile”);dbUpdater.Execute();}
捕获{/*无*/}
请尝试{dbUpdater.AddColumn(“EmployeeName”);dbUpdater.Execute();}
捕获{/*无*/}
请尝试{dbUpdater.AddColumn(“EmployeeType”);dbUpdater.Execute();}
捕获{/*无*/}
请尝试{dbUpdater.AddColumn(“EmployeeExtn”);dbUpdater.Execute();}
捕获{/*无*/}
请尝试{dbUpdater.AddColumn(“EmployeeByte”);dbUpdater.Execute();}
捕获{/*无*/}
}
}
每一列都使用此代码进入catch,此代码正确吗?该列将添加到哪个表中?
列将添加到哪个表中?

您应该使用下面的列类型,而不是需要告诉表名的列类型 列类型将取自表类

try { dbUpdater.AddColumn<Employee>("EmployeeFile"); dbUpdater.Execute(); }
catch { /* Nothing */ }
试试{dbUpdater.AddColumn(“EmployeeFile”);dbUpdater.Execute();}
捕获{/*无*/}

这可能与您的问题无关,因为来自Aanabidden的答案看起来像是bug,但我发现代码中还有另一个问题。AddColumn()操作缓存在数据库更新程序对象中,并在Execute()调用时执行。但如果第一列存在,则每次调用Execute()都会再次尝试添加它;第一次Execute()调用失败不会导致从数据库更新程序缓存中删除该操作

一旦其中一个方法失败,就没有理由调用任何其他AddColumn()或Execute()方法,因为缓存的操作将继续抛出异常

副作用是,如果第一列已经存在,则不会添加其他任何列

我看到的问题的解决方案,与您在AddColumn类型参数中错误使用“string”类型而不是表名无关,是为每个AddColumn/Execute对创建一个单独的数据库更新程序对象。然后其中一个失败不会导致其余的失败


同样,这并不是你的代码出了什么问题,但如果有什么原因导致某些列存在而其他列不存在,这就是一个bug(比如在代码中编写一些其他bug,然后像我一样将应用程序分发给客户).

当应用程序崩溃时,它会因为异常而崩溃。您可以捕获该异常,它会告诉您错误所在。没有这些信息,您只是在猜测。停止猜测。使用独立的工具资源管理器,检查数据库是否按照您的要求生成。您可以使用sdf资源管理器检查数据库我的代码没有错误。但是您没有正确复制代码。
内部应该有
名称而不是
列的类型