我有一个有计算列的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