将EF Core迁移更改为不同的默认所有者



我正在创建一个新的.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"));

最新更新