我在将架构添加到EF Core中的表属性方面有些挣扎。运行ado.net时,以下工作正常:
private static void Reademps()
{
string sql = "SELECT [Id],[empno] FROM [encrypt].[dbo].[emps]";
var connection = new SqlConnection(connectionString);
var command = new SqlCommand(sql, connection);
connection.Open();
using (SqlDataReader reader = command.ExecuteReader(System.Data.CommandBehavior.CloseConnection))
{
while (reader.Read())
{
Console.WriteLine($"id: {reader[0]} empno: {reader[1]}");
}
}
}
但是尝试转换为EF Core:
private async Task ReadempsAsync()
{
using (var context = new EmpsContext())
{
List<Emp> emps = await context.Emps.ToListAsync();
foreach (var b in emps)
{
Console.WriteLine($"{b.Id} {b.Empno}");
}
}
}
internal class EmpsContext : DbContext
{
private const string ConnectionString = @"server=localhost\SQLEXPRESS;Database=master;Integrated security=true;Database=master;Column Encryption Setting=enabled";
public DbSet<Emp> Emps { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
optionsBuilder.UseSqlServer(ConnectionString);
}
}
[Table("emps", Schema = "encrypt")]
public class Emp
{
public int Id { get; set; }
[Required]
[StringLength(50)]
public string Empno { get; set; }
}
我不断收到错误消息:
System.Data.SqlClient.SqlException:'无效的对象名称'encrypt.emps'。'
答案 0 :(得分:2)
在您的SQL中-[encrypt]
似乎是数据库名称-而不是 schema 名称(中间是dbo
)。
SELECT [Id],[empno] FROM [encrypt].[dbo].[emps]
********* ***** ******
* * * Table Name
* * Schema name
* Database name
因此您的EF Core表声明为错误,因为它将模式定义为encrypt
-事实并非如此。
所以这个:
[Table("emps", Schema = "encrypt")]
public class Emp
真的应该是:
[Table("emps", Schema = "dbo")]
**************
public class Emp
答案 1 :(得分:1)
由于"dbo"
不是架构名称,因此您只需要对架构使用encrypt
。它只是database
的名称。会是这样的:
[Table("emps", Schema = "dbo")]
public class Emp
{
public int Id { get; set; }
[Required]
[StringLength(50)]
public string Empno { get; set; }
}
注意:
在您的连接字符串中,将Database
更改为encrypt
。您的连接字符串将类似于:
private const string ConnectionString = @"server=localhost\SQLEXPRESS;Database=encrypt;Integrated security=true;Column Encryption Setting=enabled";