HasKey带有表达式?

时间:2019-12-16 20:46:04

标签: c# entity-framework entity-framework-core

我有一个DbSet,该数据库对象具有带表达式的多列关键字。例如,数据库对象(视图或表)的键为cast(Time as Date), Col2(时间的类型为DateTime)。 (我不是SQL Server数据库的所有者)

但是,以下设置密钥的方法出错。

public class MyDbContext : DbContext
{
    public DbSet<MyEntity> MyEntity { get; set; }

    protected override void OnModelCreating(ModelBuilder mb)
    {
        mb.Entity<MyEntity>().HasKey( x => new { x.Time.Date, x.Col2 } ); // Error

数据库对象(表或视图)可以具有

的唯一约束
cast(Time as Date), Col2

COL2的类型为varchar(50)

2 个答案:

答案 0 :(得分:3)

如果不更新表,使用查询类型可能是正确的答案,但是将模型简单配置为

mb.Entity<MyEntity>().HasKey( x => new { x.Time, x.Col2 } );

EF不会知道约束,但是任何违反约束的尝试都会在SQL Server上失败。

在SQL Server中,BTW是由Indexed ViewIndex on a Computed Column而不是常规的PRIMARY KEY或UNIQUE约束来强制执行的。

答案 1 :(得分:0)

由于只需要读取此表的数据,因此可以使用DbQuery代替DbSet。

public class MyDbContext : DbContext
{
    public DbQuery<MyEntity> MyEntity { get; set; }

    //... Other tables

}

编辑:显然是DbQuery is now obsolete

相反,您可以使用.HasNoKey();。在modelBuilder上

public class MyDbContext : DbContext
{
    public DbSet<MyEntity> MyEntity { get; set; }

    protected override void OnModelCreating(ModelBuilder mb)
    {
        mb.Entity<MyEntity>().HasNoKey(); // No key
    }
}