2016-01-22 63 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允許的最小日期。