【发布时间】:2011-08-04 16:16:57
【问题描述】:
我在我的 ASP.NET MVC 应用程序中首先使用实体框架代码。我的一门课有几列加在一起。我通过在数据库初始化程序中运行更改表脚本将这些列存储为表中的计算列。假设这个类看起来像:
public class Bond
{
public decimal ParAmountOfIssuance { get; set; }
public decimal AccruedInterest { get; set; }
public decimal Premium { get; set; }
public decimal OriginalIssueDiscount { get; set; }
}
修改脚本类似于:
alter table Bonds
add TotalSources as (ParAmountOfIssuance + AccruedInterest + Premium - OriginalIssueDiscount)
我希望Total Sources 列可以在网络应用程序中查看。实现这一目标的最佳方法是什么? [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 属性不起作用,因为 EF Code First 在运行 alter 脚本之前从类创建表。
欢迎提出任何建议。
【问题讨论】:
-
你不能使用 [NotMapped] 并在代码中计算它吗?这种方式并不是“代码优先”。为什么需要更改脚本中的架构?
-
恐怕您已经找到的是最终结果:不可能让 EF 创建具有计算列的数据库(除了时间戳或行版本属性)。但是您必须将
Computed属性放在属性上,以便让EF 正确处理计算列(只读取,不写入)。结果是它仅适用于映射到现有数据库,但不适用于 EF Code-First 创建的数据库。另请参阅此处:msdn.microsoft.com/en-us/library/gg193958.aspx 在“DatabaseGenerated”部分的第 2 段中。 -
@obrad,我不想在代码中执行计算,因为我不确定我的应用程序是唯一会更改列值的应用程序。 alter 脚本创建计算列。也就是说,除非你问我是否应该在编辑/查看数据时在代码中执行计算,这就是我目前正在做的事情。这似乎不是最好的做法。
-
@robert-s 如果您需要在数据库中包含一些逻辑,那么如果您接受权衡,那就可以了。如果您使用 CodeFirst 并生成数据库,这意味着您的数据库取决于您的应用程序。但是,如果您不确定是否必须在多个应用程序中使用数据库,那么权衡是 CodeFirst。如果您使用 CodeFirst,那么您应该完全不了解数据库,它是抽象的,如果您需要共享数据,则可以选择 odata 或其他服务。由于在当前版本的 CF 中没有脚本就无法做到这一点,这意味着 CF 不支持它:S
-
如果您使用 [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 或 [DatabaseGenerated(DatabaseGeneratedOption.None)] 属性,然后从脚本中仅使用公式更改此列怎么办?这样 CF 就不会写入该字段,您将能够读取它。这种方式与使用现有数据库没有什么不同,并且是受支持的。
标签: c# entity-framework ef-code-first