配置与计算列实体框架的fk关系

时间:2016-01-22 18:58:44

标签: c# sql-server database entity-framework code-first

我有一个DB模型,其中有计算列。基本的想法是,当我在表中插入新的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

问题是:如何配置实体框架(和数据库)以便能够插入Gauge初始Reading,以便计算列有效?或者在EF中可能有一种不同的插入方法可以允许这样的东西吗?对不起,请提供详细的问题。

修改我使用Gauge.Id作为FK时遇到的错误:

  

System.Data.Entity.Core.UpdateException:null存储生成的值   被退回给不可空的会员' CurrentReadingDate'类型   ' Repository.Gauge'

1 个答案:

答案 0 :(得分:0)

我认为问题在于你的功能。检查表中是否存在行,返回一些默认日期,即db。允许的最小日期。