В Core, для инициализации ConnectionString класс наследник DbContext должен переопределить метод OnConfiguring. Добавляем Dependency Injection UserSqlServer с параметром ConnectionString.
using Microsoft.EntityFrameworkCore;
namespace AmassWebApi.DataAccess.Data
{
public class AmassDb : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseSqlServer(Tools.Secrets.GetConnectionString());
}
public DbSet Categories => Set();
public DbSet Incomes => Set();
}
}
В старом Entity Framework, который не Core, строку соединения передаем параметром в конструктор базового класса.
using System.Data.Entity;
namespace Budget
{
public class BudgetDb : DbContext
{
public BudgetDb() :
base(am.DB.DBManager.Instance.ConnectionString){}
public DbSet Accounts { get; set; }
public DbSet Categories { get; set; }
public DbSet Operations { get; set; }
}
}
Очень удобно процедурку am_CreateModelClassFromTable использовать для генерации кода класса, не надо никаких экстеншенов или тем более мигрэйшена, просто генерим класс по базе ивсе.
alter proc am_CreateModelClassFromTable
@TableName sysname = 'Задай имя таблицы и получишь код класса'
as
begin
if @TableName like 'Зад%' RAISERROR('Имя таблицы не задано', 16, 1)
declare @Result varchar(max) = 'public class ' + @TableName + '
{'
select @Result = @Result + '
public ' + ColumnType + NullableSign + ' ' + ColumnName + ' { get; set; }'
from
(
select
replace(col.name, ' ', '_') ColumnName,
column_id ColumnId,
case typ.name
when 'bigint' then 'long'
when 'binary' then 'byte[]'
when 'bit' then 'bool'
when 'char' then 'string'
when 'date' then 'DateTime'
when 'datetime' then 'DateTime'
when 'datetime2' then 'DateTime'
when 'datetimeoffset' then 'DateTimeOffset'
when 'decimal' then 'decimal'
when 'float' then 'double'
when 'image' then 'byte[]'
when 'int' then 'int'
when 'money' then 'decimal'
when 'nchar' then 'string'
when 'ntext' then 'string'
when 'numeric' then 'decimal'
when 'nvarchar' then 'string'
when 'real' then 'float'
when 'smalldatetime' then 'DateTime'
when 'smallint' then 'short'
when 'smallmoney' then 'decimal'
when 'text' then 'string'
when 'time' then 'TimeSpan'
when 'timestamp' then 'long'
when 'tinyint' then 'byte'
when 'uniqueidentifier' then 'Guid'
when 'varbinary' then 'byte[]'
when 'varchar' then 'string'
else 'UNKNOWN_' + typ.name
end ColumnType,
case
when col.is_nullable = 1 and typ.name in ('bigint', 'bit', 'date', 'datetime', 'datetime2', 'datetimeoffset', 'decimal', 'float', 'int', 'money', 'numeric', 'real', 'smalldatetime', 'smallint', 'smallmoney', 'time', 'tinyint', 'uniqueidentifier')
then '?'
else ''
end NullableSign
from sys.columns col
join sys.types typ on
col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id
where object_id = object_id(@TableName)
) t
order by ColumnId
set @Result = @Result + '
}'
print @Result
end
Entity Framework old vs. Core
Tagged on: EntityFramework LINQ