添加架构EF Core表属性

时间:2019-03-04 02:52:58

标签: c# entity-framework ef-code-first entity-framework-core

我在将架构添加到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'。'

2 个答案:

答案 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";