SQL Server EF7 rc1:插入或更新具有计算列的实体时出错

wsxa1bj1  于 2022-11-28  发布在  其他
关注(0)|答案(2)|浏览(120)

我在插入或更新具有计算列的实体时遇到以下错误,该计算列从基于其他表的值的标量函数中获取值。
SqlException(SQL例外状况):无法在OUTPUT子句中引用列“inserted.SubjectStatus,”因为该列定义包含子查询或者引用了执行用户或系统数据访问得函数.默认情况下,如果函数未绑定到架构,则假定该函数执行数据访问.请考虑从列定义中删除子查询或函数,或者从OUTPUT子句中删除该列.
我的实体(Subject)具有属性为DatabaseGenerated(DatabaseGeneratedOption.Computed)的特性SubjectStatus
另外,我在DbModelBuilder上有以下代码:

modelBuilder.Entity<Subject>()
                    .Property(e => e.SubjectStatus)
                    .HasColumnType("int")
                    .HasComputedColumnSql("dbo.SubjectStatus(Id)")
                    .ValueGeneratedOnAddOrUpdate();

我的网络搜索没有帮助。有什么解决办法吗?

ecfdbz9o

ecfdbz9o1#

我相信,你已经在数据库中创建了一个计算列,并为该列分配了一个函数。删除对该列添加的函数,只保留该列。

ALTER FUNCTION [dbo].[LMSFN_Course_GetEnrollmentCount] (@CourseID int)
RETURNS INT

从属性中移除ValueGeneratedOnAddOrUpdate
也不需要添加属性DatabaseGenerated(DatabaseGeneratedOption.Computed).

dgiusagp

dgiusagp2#

从.net 6升级到.net 7后,我也遇到了同样的问题。根据微软的官方文件,这是一个突破性的变化:
ef核心7.0重大更改
对我来说,以下更改是有效的:

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<Subject>()
        .Property(e => e.SubjectStatus)
        .HasComputedColumnSql("dbo.SubjectStatus(Id)");

    builder.Entity<Subject>()
        .ToTable(tbl => tbl.HasTrigger("dbo.SubjectStatus(Id)"));
}

相关问题