SubSonic编辑类问题

时间:2011-04-01 10:33:09

标签: c# subsonic

我在SubSonic遇到一个非常奇怪的问题,当我编辑一个类时,数据库没有被更新,即使我删除它并重新生成它。

示例:简单类

public class Customer {
    public Guid Id { get; set; }
    public string Description { get; set; }
}

Customer c = new Customer() { Id = Guid.NewGuid(), Description = "Toaster" };

var repo = new SimpleRepository("CustomerTest", 
    SimpleRepositoryOptions.RunMigrations);
repo.Add(c);

如果我运行此代码它可以正常工作,创建一个表“Customer”并插入烤箱的行。但是,如果我决定将我的Customer类更改为:

public class Customer {
    public Guid Id { get; set; }
    public string Description { get; set; }
    public int Cost { get; set;}
}

运行相同的代码,为Cost属性添加一个值,数据库表保留为“Id,Description”。如果我在Customer字段中创建一个全新的类并且过去,它将在第一次正确创建表,并且任何更改似乎都不起作用。

任何帮助?

1 个答案:

答案 0 :(得分:0)

  • 首先,您应该尝试弄清楚亚音速是否正确检测到您的班级定义变化 这段代码应该为您提供亚音速想要执行的语句的概述。

    var migrator=new SubSonic.Schema.Migrator(Assembly.GetExecutingAssembly());
    var provider=ProviderFactory.GetProvider("CustomerTest");
    string[] commands=migrator.MigrateFromModel<Customer>(provider);  
    

    命令应包含亚音速要对数据库进行的所有更改。 您可以自己执行以下命令:     BatchQuery query = new BatchQuery(provider);     foreach(命令中的var)         query.QueueForTransaction(new QueryCommand(s.Trim(),provider));

    //pop the transaction
    query.ExecuteTransaction();
    

    (代码取自http://subsonicproject.com/docs/3.0_Migrations) 也就是说,我认为在你的情况下命令将是空的。 在这种情况下,可能是由您正在使用的提供程序(SqlServer / MySQL / SQLite / Oracle)未实现的语句引起的。也许您应该下载SubSonic源并进入migrator.MigrateFromModel(...)方法以查看会发生什么。

  • 另一个可能的原因(如果您使用MySQL)可能是您的信息架构不是最新的。我刚才遇到过这个问题。更改我的数据库并使用SubSonic 2重新生成DAL后,我生成的代码没有改变 我发现mysql信息模式(以及亚信件对信息模式的查询)还没有改变。 我通过执行导致信息方案重新加载的FLUSH TABLES解决了这个问题。我不知道这是不是mysql中的错误或想要的行为,但你应该先尝试FLUSH TABLES。