我有一個有計算列的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'。
我認爲問題出在你的功能上。檢查表中是否沒有行存在,返回一些默認日期,這是db –
@MujahidDaudKhan允許的最低日期不可置信。謝謝!就這樣。對所有函數進行空檢查確實有效!我一直在看問題全是錯的.. – Sami