我在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字段中创建一个全新的类并且过去,它将在第一次正确创建表,并且任何更改似乎都不起作用。
任何帮助?
答案 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。