【问题标题】:Configure fk relations with computed columns Entity Framework使用计算列实体框架配置 fk 关系
【发布时间】:2016-01-22 18:58:44
【问题描述】:

我有一个数据库模型,其中有计算列。基本思想是,当我在表中插入一个新的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:存储生成的空值 为类型为不可为空的成员“CurrentReadingDate”返回 'Repository.Gauge'。

【问题讨论】:

  • 我认为问题出在你的函数上。检查表中是否不存在行,返回一些默认日期,即 db 允许的最小日期
  • @MujahidDaudKhan 难以置信。谢谢!就这样。对所有函数进行空值检查就可以了!我一直在看问题。。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    相关资源
    最近更新 更多