[英]Configure fk relations with computed columns Entity Framework
我有一个数据库模型,其中有计算列。 基本思想是,当我将新的Gauge
插入表中时,新的Reading
将自动首先插入到另一个表中。 表Gauges
具有一个计算列(准确地说是几个列),该列可获取最新Reading
的日期。
当我有一个用作外键的INT
字段时,一切都很好。 现在范围变得如此之大,以至于我不能再依赖于该领域的独特性,因此我需要更改FK。
首先,我尝试使用Gauge.Id
属性,这很理想,因为这是表中的主键。 问题是该Id
是在数据库中生成的,因此不知道何时插入第一个Reading
。 还尝试将另一个Guid
属性添加到模型并将其用作FK,也没有使其起作用。 我还尝试了在插入之前检查数据库中最大的Id
值,并在创建时将其分配给新的Gauge
,也没有运气。 不幸的是,我不记得所有的尝试和错误组合都能更好地阐明每次尝试中的问题。
我使用的是Entity Framework 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
问题是:如何配置实体框架(和数据库)以能够插入具有初始Reading
的Gauge
,以便计算出的列起作用? 还是在EF中可能有其他插入方法允许类似这样的事情? 对不起,这个冗长的问题。
编辑我将Gauge.Id
用作FK时遇到的错误:
System.Data.Entity.Core.UpdateException:对于类型为'Repository.Gauge'的不可为空的成员'CurrentReadingDate',返回了一个空的商店生成的值。
我认为问题出在您的职能上。 检查表中是否没有行,返回一些默认日期,该日期是db允许的最小日期。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.