我们的数据库没有外键,但我们希望能够使用SubSonic。除了用外键来表示表之间的关系外,还有什么办法吗?有了SubSonic,有没有一种方法可以在没有外键的情况下表达关系?
1
A
回答
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。
相关问题
- 1. 有没有一种方法可以让WiX在每种情况下抑制ICE
- 2. 有没有一种方法可以在没有登录Netsuite的情况下提供可用的Suitelet表单?
- 3. 有没有一种方法可以告诉DataReader是否在没有调用.Read()的情况下迭代了?
- 4. 有没有一种方法可以接收外焦表单的关键输入?
- 5. 外键关系没有意义,有没有更好的方法?
- 6. 有没有方法可以在没有GraphQL的情况下使用Relay?
- 7. 在没有外键的情况下在关系表中添加一列 - 休眠
- 8. 有没有一种方法可以在没有iframe覆盖的情况下在Silverlight中显示HTML?
- 9. DynamoDB:有没有一种方法可以在没有LastEvaluatedKey的情况下获取任意页面?
- 10. 有没有一种方法可以在没有_id字段的情况下从MongoDB中检索数据?
- 11. Git-Stash:有没有一种方法可以防止合并功能在没有rebase的情况下发展?
- 12. 有没有一种方法可以在没有onclick事件的情况下使用onclick?
- 13. 有没有一种方法可以在没有网络服务器的情况下发送php post请求?
- 14. 有没有一种方法可以在没有持续推送通知的情况下显示倒计时?
- 15. ScalaTest in sbt:有没有一种方法可以在没有标签的情况下运行单个测试?
- 16. 有没有一种方法可以在没有Composer的情况下自动加载ZF3?
- 17. 有没有一种方法可以在没有构建应用程序的情况下练习单元测试?
- 18. 有没有方法可以在没有按下Ctrl键的情况下在ObjectListView中进行多重选择?
- 19. 有没有什么方法可以在不使用联结表的情况下表示多对多关系?
- 20. SQLAlchemy关系没有外键
- 21. Linq2Sql:我可以使用外键关系在两个表中没有主键的情况下创建实体吗?
- 22. 在没有连接两个表的情况下选择一列(具有外键)
- 23. 有没有一种方法可以在没有os.chmod的* nix系统下使用Python创建可执行文件?
- 24. 笨:没有在某种情况下
- 25. 有没有一种方法可以让表单在不使用iFrame的情况下位于顶层
- 26. 开关的情况下没有在JavaScript
- 27. 在Visual Studio中,有没有一种方法可以按使用情况对私有方法进行排序?
- 28. 有没有一种简单的方法来在没有JavaScript的情况下在PHP中获取图像大小?
- 29. 在C++映射中,有没有什么方法可以在给定值的情况下搜索关键字?
- 30. 如何在ActiveRecord中没有外键的情况下定义关系?