我正在创建一个新的.NET Core 3.1.3应用程序,连接到新的SQL Server 2016数据库。该连接是受信任的连接。EF迁移工具正在创建由我作为所有者的表。
dotnet ef migrations add InitialDb
dotnet ef database update
我不想那样。我希望这些表由我们为此目的创建的服务id所有。将表创建默认给该所有者的最安全、最有效的方法是什么?
如果您没有为实体指定模式,EF将在没有指定模式的情况下生成DDL。在SQL Server中,这意味着对象将在用户的默认模式中创建。通常,用户的默认模式应该是dbo
,但如果不是,则对象将在不同的模式中创建。
在SQL Server中,对象由创建对象的架构的所有者所有(同样是默认情况下(。
因此,配置要在dbo
模式中创建的表,或者将用户的默认模式配置为dbo
,对象将在dbo
模式中创建并归dbo
所有。
例如在OnModelCreating中,添加
foreach (var et in modelBuilder.Model.GetEntityTypes())
{
et.SetSchema("dbo");
}
或在SQL 中
alter user [yourdomainyouruser] with default_schema=dbo
请注意,如果您是数据库所有者或系统管理员,则始终以dbo
的身份连接到数据库,并且您的非限定DDL将在dbo
模式中创建对象。
我希望表由服务id 所有
您通常不希望应用程序用于连接的标识拥有对象,因为该标识应该处于权限最低的角色中。EG没有删除表或创建触发器的能力。通常,这些对象应该简单地归dbo
所有。
至少从EF Core 6开始,可以更简洁
modelBuilder.HasDefaultSchema("dbo");
请注意,如果使用内置的历史记录表,则需要在onConfiguring
中放置额外的代码。类似的东西
optionsBuilder.UseSqlServer(x => x.MigrationsHistoryTable("__EFMigrationsHistory", "dbo"));