[英]Entity Framework Code First: Computed property that can access to is own table
[英]How should I access a computed column in Entity Framework 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; }
}
alter脚本如下:
alter table Bonds
add TotalSources as (ParAmountOfIssuance + AccruedInterest + Premium - OriginalIssueDiscount)
我希望Total Sources
列可以在Web应用程序中查看。 实现这一目标的最佳方法是什么? [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
属性不起作用,因为EF Code First在运行alter脚本之前从类创建表。
欢迎任何建议。
我有一个解决方法。
您只能在现有数据库上使用计算字段。
如果将属性添加到CF对象:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public decimal TotalSources { get; set; }
如果在脚本中添加一行,将删除有关该数据库生成的信息:
DELETE FROM [dbo].[EdmMetadata]
CF将假设它是现有数据库,它会工作,我刚刚尝试过。
更新我忘记了,如果你像这样添加属性到你的邦德实体,那么在你的脚本中你需要改变它来计算它,而不是添加它:)你甚至可以手动“同步”数据库和模型 - 在你拥有的地方一切都在没有这个字段的情况下工作,在计算模型中添加它,并在计算表中。 当您从edm元数据表中删除哈希时,CF将无需尝试使用数据库重新生成模型。
这绝对不受支持 - 在自定义属性上定义Computed
选项将引发异常。 代码优先=代码中的逻辑。 如果需要自定义计算属性,请先使用数据库。 代码首先支持的唯一数据库逻辑是标识列和时间戳。
问题是您需要将列标记为已计算,但创建数据库将不允许该列。 如果列未标记为计算,则它将是可更新的= EF将生成尝试更新此列的更新语句,该列将在数据库中失败。
我正在做CF(WinForms)中的计算列(我不知道它是否是最好的):
这是一个实体:
public class Result
{
public int ResultId { get; set; }
public int StudentId { get; set; }
public Student Student { get; set; }
public float Arabic { get; set; }
public float English { get; set; }
public float Math { get; set; }
public float Science { get; set; }
public float Total { get; set; }
}
这是Form2:
private void Form2_Load(object sender, EventArgs e)
{
Model1 model = new Model1();//Model1 : DbContext
model.Database.CreateIfNotExists();
model.Database.ExecuteSqlCommand("alter table Results drop column Total; alter table Results add Total AS (Arabic + English + Math + Science)");
var r1 = (from s in model.Students
join r in model.Results
on s.StudentId equals r.StudentId
select new { s.StudentName, r.Arabic, r.English, r.Science, r.Math, r.Total }).ToList();
dataGridView1.DataSource = r1;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.