开发者

SubSonic edit class problem

I'm having a very odd issue with SubSonic where when I edit a class the database isn't being updated, even when I delete it and regenerate it.

Example: Simple class

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);

If I run this code it works perfectly, creates a table "Customer" and inserts the row for the toaster. However if I decide to change my Customer class to:

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

And run the same code adding a value for the Cost property the database table remains "Id, Description". If I create a totally new class and past in the Customer fields it will create the table correctly the first time and again any changes dont appear to work.

Any help?


  • First off all, you should try to figure out if subsonic detects your class definition changes properly.
    This code should give you a overview of the statements subsonic want's to execute.

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

    commands should contain all changes subsonic wants to make to your database. You can execute these commands by yourself with: BatchQuery query = new BatchQuery(provider); foreach(var s in commands) query.QueueForTransaction(new QueryCommand(s.Trim(), provider));

    //pop the transaction
    query.ExecuteTransaction();
    

    (code taken from http://subsonicproject.com/docs/3.0_Migrations).
    That said, I suppose commands will be empty in your case. In that case that could be caused by a statement that is not implemented by the provider you are using (SqlServer/MySQL/SQLite/Oracle). Maybe you should download the SubSonic source and step into the migrator.MigrateFromModel(...) method to see what happens.

  • Another possible cause (if you use MySQL) could be that your information schema is not up to date. I encountered this problem a while ago. After changing my database and regenerating the DAL with SubSonic 2, my generated code didn't change.
    I figured out that the mysql information schema (and subsonic does queries on the information schema) hadn't changed yet. I solved this by executing FLUSH TABLES which caused the information scheme to reload. I don't know if that's a bug in mysql or desired behaviour but you should try FLUSH TABLES first.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜