2011-04-14 61 views
11

我正在使用实体框架代码首先,我有一个使用StartTime属性,EndTime属性和Duration属性(以及其他一些属性)定义的实体。 Duration属性是一个计算字段,它是开始和结束时间之间的持续时间(分钟)。我的属性声明如下:使用实体框架存储只读计算字段代码优先

public DateTime StartTime { get; set; } 
public DateTime EndTime { get; set; } 
public int Duration 
{ 
    get 
    { 
     return (int)this.EndTime.Subtract(this.StartTime).TotalMinutes; 
    } 
} 

我想运行这个计算的代码,但具有持续时间值保存到数据库与起始和结束时间值一起(以方便以后的路线当我来运行报告反对这些数字)。

我的问题是,我怎么能得到这个只读属性映射回来,并保存到数据库中使用代码第一?

回答

19

通过Slauma的回答启发,我能够实现我通过使用保护二传手瞄准。这将该值保留回数据库,但不允许在其他地方修改该值。

我的财产,现在看起来是这样的:

public int Duration 
{ 
    get 
    { 
     return (int)this.EndTime.Subtract(this.StartTime).TotalMinutes; 
    } 
    protected set {} 
} 
+0

啊,好主意,以它的保护!你是否也试图让制定者为“私人”?知道EF是否会将该属性映射到数据库列会很有趣。 – Slauma 2011-04-14 14:05:09

+1

我刚刚尝试过一个“私人”制定者,并且令人惊讶的是它继续工作! – KevB 2011-04-14 15:02:27

+3

EF每次加载此实体时都会更新数据库。我们猜测EF的变更跟踪错误地认为这个属性已经改变。对我们来说,这会导致意外的并发冲突。 – 2012-12-05 23:33:49

2

供应空二传手可能是一个可能的解决方案(虽然那么属性不再只读,当然):

public int Duration 
{ 
    get 
    { 
     return (int)this.EndTime.Subtract(this.StartTime).TotalMinutes; 
    } 
    set { } 
} 

据我所知,只读属性不可映射到在列数据库。