2010-07-06 107 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。

相關問題