繁体   English   中英

使用计算列配置fk关系Entity Framework

[英]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

问题是:如何配置实体框架(和数据库)以能够插入具有初始ReadingGauge ,以便计算出的列起作用? 还是在EF中可能有其他插入方法允许类似这样的事情? 对不起,这个冗长的问题。

编辑我将Gauge.Id用作FK时遇到的错误:

System.Data.Entity.Core.UpdateException:对于类型为'Repository.Gauge'的不可为空的成员'CurrentReadingDate',返回了一个空的商店生成的值。

我认为问题出在您的职能上。 检查表中是否没有行,返回一些默认日期,该日期是db允许的最小日期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM