我有一个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)
。
答案 0 :(得分:3)
如果不更新表,使用查询类型可能是正确的答案,但是将模型简单配置为
mb.Entity<MyEntity>().HasKey( x => new { x.Time, x.Col2 } );
EF不会知道约束,但是任何违反约束的尝试都会在SQL Server上失败。
在SQL Server中,BTW是由Indexed View或Index 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
}
}