2010-07-06 67 views

回答

3

有迹象表明,我想起三种可能的解决方案:

一)难的方法:不要寄托都自己

由亚音速生成的每个类是局部类。您可以创建一个新的文件,并添加了ForeignKey的关系,自己属性的方法:

这是从内存中写的,而不是测试
partial class Order 
{ 
    private OrderDetailCollection orderDetails; 
    public OrderDetailCollection OrderDetails 
    { 
     get 
     { 
      if (orderDetailCollection == null) 
       orderDetailCollection = new OrderDetailCollection() 
       .Where(OrderDetailCollection.Columns.OrderId, this.Id).Load(); 

      return orderDetailCollection; 
     } 
     set 
     {    
      if (value != null) 
      { 
       foreach(OrderDetail orderDetail in value) 
        orderDetail.OrderId = this.Id; 
      } 
      orderDetailCollection = value; 
     } 
    } 

} 

public Class OrderDetail 
{ 
    private Order order; 
    public Order Order 
    { 
     get { return order ?? DB.Select().From<Order>() 
           .Where(Id).IsEqualTo(this.OrderId) 
           .ExecuteSingle<Order>(); } 
     set 
     { 
      this.OrderId = value == null ? 0 : value.Id; 
      this.Order = value; 
     } 
    } 
} 

。您可以查看生成的代码或模板应该如何(SubSonic添加一些事件处理程序,用于添加和删除项目以处理ParentId更新并在BindingContext右侧维护DeleteList以供使用)

b)简单的方法:为使用外键的代码生成一个数据库(我会推荐这个解决方案),让SubSonic为你生成外键部分。 请勿触摸您的生产数据库。
在运行时SubSonic(至少2.x)不依赖任何真正的外键存在。信息模式仅在DAL生成期间被查询。

三)面向对象的方法:从你目前使用的一个继承了写自己的亚音速的DataProvider和覆盖GetTableSchema()方法

public override TableSchema.Table GetTableSchema(string tableName, TableType tableType) 
{ 
    TableSchema.Table tbl = base.GetTableSchema(tableName, tableType) 

    if (tableName == "Orders") 
    { 
      tbl.ForeignKeys = new TableSchema.ForeignKeyTableCollection(); 

      tbl.Columns.GetColumn("Id").ForeignKeyTableName = "OrderDetails"; 
      TableSchema.ForeignKeyTable fkTable = new TableSchema.ForeignKeyTable(this); 
      fkTable.ColumnName = "OrderId"; 
      fkTable.TableName = "OrderDetails"; 
      tbl.ForeignKeys.Add(fkTable); 
    } 
    else if (tableName == "SomethingElse) 
    { 
      .... 
    } 
} 

在这种方法中的所有信息架构数据拉从数据库并用于设置您的数据库的内存表示。这里是MySqlInnoDbDataProvider的源:http://github.com/subsonic/SubSonic-2.0/blob/master/SubSonic/DataProviders/MySqlInnoDBDataProvider.cs

(MySQL的数据提供者是一个很好的例子,因为默认的“MySqlDataProvider”不产生FK-关系,即使有一个InnoDB数据库和“MySqlInnoDbDataProvider”使用从它继承和覆盖所需的部件。

在你的app.config/web.config中可以定义为DataProvider的一代。

这些建议是SubSonic2但可能适用于SubSonic3。

相关问题