2009-09-24 27 views
1

根据这篇文章: http://subsonicproject.com/docs/3.0_Migrations你如何处理SubSonic与迁移的“关系”?

Bottom line: if you're a developer that is concerned about database design, 
migrations might not be for you. 

好吧,这很好,我可以把数据库作为数据简单的持久存储库不包含任何业务逻辑。换句话说,一个荣耀的文本文件。

我不知道该怎么做是将两个对象联系在一起。举个例子,这两个类:

public class Disaster 
{ 
    public int DisasterId { get; set; } 
    public string Name { get; set; } 
    public DateTime? Date { get; set; } 
    public IList<Address> Addresses { get; set; } 
} 

public class Address 
{ 
    public int AddressId { get; set; } 
    public string WholeAddressHereForSakeOfBrevity { get; set; } 
} 

Disaster包含多个AddressesIList的灾难都打的。当我使用SimpleRepository将这些添加到数据库SimpleRepositoryOptions.RunMigrations时,它会生成包含所有列的表,但不包含所需的外键列。

我会如何将这两者联系起来,以便当我拨打Disaster.Addresses时,我会得到所有受影响Addresses的列表?这是可能的还是我必须改用ActiveRecord并首先创建数据库表?或者,我是否必须将灾难ID的列添加到Address?如果是这样,这种方法对于多对多关系如何工作?

回答

1

这是可能的 - 你只需要手工完成。将属性添加到名为“Addresses”的Disaster中,并将其设置为IList(或者,如果您希望将其设置为Lazy Load,则可以将其设置为IQueryable)。当您检索灾难时,请务必检索您的地址。

这是一种“手动” - 但这就是主意。我正在对此进行增强,希望能够在以后的版本中推出。

而之前,你问为什么我没有这样做的第一个地方:)这是因为我不知道是否应该使用基于父母/子女关系的多对多或一对多。在你的例子中,我想这可能是1对多,但根据我所知道的地址和灾难(特别是在佛罗里达州),它应该是多对多的。底线 - SubSonic如何知道这一点?我们可以反思这两个对象的“双向性”,这意味着如果Address有很多灾难(这是显而易见的) - 但是如果你喜欢DDD,那么编码就不是很好。

我倾向于这种规则与某种类型的覆盖,将迫使问题。你对此的看法是欢迎的:)

+0

正如你可以在我原来的文章中提供的代码中看到的,我没有添加IList(我现在已经转换为IQueryable,因为我想延迟加载)到Disaster类。不过,我不确定你的意思是“只要确保找回你的地址”。如果这个关联没有存储在数据库中,我怎么知道要检索哪个地址? – 2009-09-24 01:51:04

+0

如果它在数据库中没有关系...那么你有点迷失在我的那里。如果它在另一个系统中,那么在你需要时调用它。 – 2009-09-29 18:30:15