我应该如何访问Entity Framework Code First中的计算列?

Rob*_* S. 10 c# entity-framework ef-code-first

我在ASP.NET MVC应用程序中使用Entity Framework Code First.我的一个类有几个相加的列.我通过在数据库初始化程序中运行alter table脚本将这些列存储为表中的计算列.让我们说这堂课看起来像:

public class Bond
{
        public decimal ParAmountOfIssuance { get; set; }
        public decimal AccruedInterest { get; set; }
        public decimal Premium { get; set; }
        public decimal OriginalIssueDiscount { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

alter脚本如下:

alter table Bonds
add TotalSources as (ParAmountOfIssuance + AccruedInterest + Premium - OriginalIssueDiscount)
Run Code Online (Sandbox Code Playgroud)

我希望该Total Sources列可以在Web应用程序中查看.实现这一目标的最佳方法是什么?该[DatabaseGenerated(DatabaseGeneratedOption.Computed)]属性不起作用,因为EF Code First在运行alter脚本之前从类创建表.

欢迎任何建议.

Gor*_*vic 12

我有一个解决方法.

您只能在现有数据库上使用计算字段.

如果将属性添加到CF对象:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public decimal TotalSources { get; set; }
Run Code Online (Sandbox Code Playgroud)

如果在脚本中添加一行,将删除有关该数据库生成的信息:

DELETE FROM [dbo].[EdmMetadata]
Run Code Online (Sandbox Code Playgroud)

CF将假设它是现有数据库,它会工作,我刚刚尝试过.

更新我忘记了,如果你像这样添加属性到你的邦德实体,那么在你的脚本中你需要改变它来计算它,而不是添加它:)你甚至可以手动"同步"数据库和模型 - 在你拥有的地方一切都在没有这个字段的情况下工作,在计算模型中添加它,并在计算表中.当您从edm元数据表中删除哈希时,CF将无需尝试使用数据库重新生成模型.


Lad*_*nka 6

绝对不受支持 - Computed定制属性上的定义选项将抛出异常.代码优先=代码中的逻辑.如果需要自定义计算属性,请先使用数据库.代码首先支持的唯一数据库逻辑是标识列和时间戳.

问题是您需要将列标记为已计算,但创建数据库将不允许该列.如果列未标记为计算,则它将是可更新的= EF将生成尝试更新此列的更新语句,该列将在数据库中失败.