假设我的数据库中有一个名为Orders的表,其中包含以下列:
的OrderId 订购日期 CancelDate 发货日期 LastActionDate
我希望LastActionDate始终是OrderDate,CancelDate和ShipDate的最新日期。实现这一目标的最佳方法是什么?有没有办法处理这三个日期的OnChanged事件,以便只要这些属性发生变化,就可以重新计算LastActionDate?或者是否有一些内置的Linq 2 Sql魔法来处理这种情况?或者,每当我更改三个日期中的任何一个时,我是否必须确保设置LastActionDate?
答案 0 :(得分:1)
在Linq-to-SQL模型中,每个实体的每个属性都有一个名为“(propertyname)Changed()”的部分方法。
部分方法是C#3.0的一个新特性 - 它们是定义的方法,但不一定具有实际的实现。如果他们没有实现,那么对他们的任何调用都将在构建过程的链接阶段被删除。
但是,如果确实提供了实现,那么确实会调用该实现。由于您的实体类(如Order
)是部分类,因此您可以轻松创建自己的附加部分类并定义这些方法。
因此,在您的情况下,您会找到OrderDateChanged()
,CancelDateChanged()
和ShipDateChanged()
。
通过这些方法,您可以轻松调用名为CalculateLastActionDate()
的方法,根据需要计算新日期。应该相当容易。
public partial class Order
{
void OrderDateChanged()
{
CalculateLastActionDate();
}
......
private void CalculateLastActionDate()
{
... your implementation here
}
}
马克
答案 1 :(得分:0)
如果您想要计算LastActionDate,则不应将其作为数据库中的列。
假设该列不在数据库中,它也不应该是自动生成的L2S代码的一部分。这很好,因为这意味着您可以自己添加它,因为自动生成的L2S类是部分类。
添加一个新的C#代码文件,并使用与自动生成的Order类完全相同的签名声明Order类,并添加您计算的属性。像这样:
public partial class Order
{
public DateTime LastActionDate
{
get
{
// pick the desired value from the other
// three properties and return it
}
}
}
请注意类声明中的partial
关键字。