В 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<Category> Categories => Set<Category>();
        public DbSet<Income> Incomes => Set<Income>();

    }
}

				
			
Код взят из проекта AmassWebApi

В старом Entity Framework, который не Core, строку соединения передаем параметром в конструктор базового класса.

				
					using System.Data.Entity;

namespace Budget
{
    public class BudgetDb : DbContext
    {
        public BudgetDb() : 
            base(am.DB.DBManager.Instance.ConnectionString){}

        public DbSet<Account> Accounts { get; set; }
        public DbSet<Category> Categories { get; set; }
        public DbSet<Operation> Operations { get; set; }
    }
}

				
			
Код взят из проекта Budget

Очень удобно процедурку 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:     

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.