2016-01-22 44 views
0

我有一个有计算列的DB模型。基本思想是,当我在表格中插入新的Gauge时,首先会自动将新的Reading插入到另一个表格中。表Gauges有一个计算列(或几个确切的),它提取最新的Reading的日期。配置与计算列的fk关系实体框架

这一切工作正常时,我有一个INT字段被用作外键。现在范围越来越大,我不能再依靠这个领域的独特性,所以我需要改变FK。

首先,我尝试使用Gauge.Id属性,这将是理想的,因为这是表中的主键。问题是Id在数据库中生成,所以在插入第一个Reading时不知道。也尝试添加另一个Guid财产的模型,并使用它作为FK,也没有得到它的工作。我也尝试在插入前检查数据库中最大的Id值,并在创建时将其分配给新的Gauge,但没有任何运气。不幸的是,我不记得所有的尝试和错误组合,以更好地澄清每次尝试的问题。

我使用实体框架6代码优先。

对象模型是:

public class Gauge 
{ 
    public int Id { get; set; } 
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
    public DateTime CurrentReadingDate { get; set; } 
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
    public decimal CurrentReading { get; set; } 
} 

public class GaugeReading 
{ 
    public int Id { get; set; } 
    public int GaugeId { get; set; } 
} 

数据库:

[dbo].[Gauges] 
[Id]     INT    IDENTITY (1, 1) NOT NULL, 
[CurrentReadingDate] AS    ([dbo].[CurrentReadingDate]([Id])), 
[CurrentReading]  AS    ([dbo].[CurrentReading]([Id])) 

[dbo].[GaugeReadings] 
[Id]   INT    IDENTITY (1, 1) NOT NULL, 
[GaugeId]  INT    NOT NULL, 
[ReadingDate] DATETIME   NOT NULL, 
[Reading]  DECIMAL (18, 2) NOT NULL, 

功能:

CREATE FUNCTION [dbo].[CurrentReadingDate] 
(
    @id int 
) 
RETURNS DATE 
AS 
BEGIN 
    RETURN (SELECT MAX(GaugeReadings.ReadingDate) 
      FROM GaugeReadings 
      WHERE dbo.GaugeReadings.GaugeId = @id) 
END 

的问题是:如何配置实体框架(和数据库)来能够插入一个初始的以便计算列可以工作?或者在EF中可能有不同的插入方法可以允许这样的事情?对于详细的问题抱歉。

编辑同时使用Gauge.Id作为FK我得到的错误:

System.Data.Entity.Core.UpdateException:一个空店生成的值 返回一个非空的成员'CurrentReadingDate' 'Repository.Gauge'。

+1

我认为问题出在你的功能上。检查表中是否没有行存在,返回一些默认日期,这是db –

+0

@MujahidDaudKhan允许的最低日期不可置信。谢谢!就这样。对所有函数进行空检查确实有效!我一直在看问题全是错的.. – Sami

回答

0

我觉得问题出在你的功能上。检查表中是否存在行,返回一些默认日期,这是db允许的最小日期。