我对代码优先方法有点陌生,但是在使用实体框架之前我使用了数据库优先方法,现在我想先使用代码,这是一种习惯。
我开始创建模型,一切都很好,然后也启用了迁移和添加迁移,一切正常,但是当我运行 Update-Database 命令时出现错误。
因此,我想使用凭据创建一个代码优先的数据库,经过大量研究,我没有找到解决方案,大多数教程都使用"可信连接"。
我使用什么
应用配置
版<connectionStrings>
<add name="CodeFirst" connectionString="Server=.SQLEXPRESS;Database=CodeFirst;User ID=anyuser;Password=anypassword;"
providerName="System.Data.SqlClient" />
</connectionStrings>
数据库上下文类
public class CodeFirstContext : DbContext
{
public CodeFirstContext() : base("name=CodeFirst")
{
}
public DbSet<Product> Products { get; set; }
public DbSet<Category> Categories { get; set; }
}
我得到的错误
Login failed for user 'anyuser'.
问题是我做错了什么? 或者使用凭据不能使用代码优先方法完成?
提前致谢
OP:
我想使用凭据创建代码优先的数据库,
。和:
经过大量研究,我没有找到解决方案,大多数教程都使用"可信连接"。
在使用特定登录名部署到新数据库时,代码优先方法存在问题 - 这是先有鸡还是先有蛋,因为:
- 数据库尚不存在
- 连接字符串正在请求显式登录
- 登录名在 SQL 中尚不存在
- 因为数据库不存在
OP的配置:
<connectionStrings>
<add name="CodeFirst"
connectionString="Server=.SQLEXPRESS;Database=CodeFirst;User ID=anyuser;Password=anypassword;"
... />
</connectionStrings>
那么解决方案是什么?
使用集成安全性:这允许您从代码从头开始创建数据库。 但是,您可能需要的任何其他登录名可能必须在以后创建。 但是,从数据库上讲,这是一种不好的做法,因为您应该拥有一个帐户进行部署(具有足够的部署权限(和另一个用于常规应用程序访问的帐户(并且没有部署权限(
首先创建登录名:这允许您使用指定的登录名,但是您很可能需要先从SQL创建一个空白数据库,然后才能创建登录名。 代码优先的纯粹主义者可能不喜欢这个想法。
后者确实遵循了 DACPAC 最佳实践,您应该从数据库优先时代就已经熟悉。 就像 DACPAC 不应该部署登录名和调整安全性一样,也不应该首先使用代码。 毕竟,归根结底,数据库并不关心您是使用代码优先还是数据库优先(在幕后,两者都可能采用某种形式的加密脚本(,但您的数据库管理员可能会根据安全性的使用方式引起注意。
数据库优先方法更好吗?
在">不要那样做">的主题中,试试这个,代码优先试图通过代码做所有事情,而崇高的追求可能并不现实。 如上所述,尝试创建登录名等某些操作可能无法实现。
同时,通过从数据库端部署 DACPAC,执行数据库优先架构更改。 身份验证是通过首先用于进入 SSMS(例如(的登录名进行的。DACPAC 部署不需要代码、.NET 或其他。
DACPAC可以创建和/修改数据库安全性,包括登录,但通常不受欢迎。
您可能希望首先重新考虑代码。 代码优先和 EF 迁移在现实世界中并没有真正成功,在现实世界中,你已经暂存了 CD 环境(如 DEV(;测试;UAT 和 PROD。
我看到很多开发人员仅使用代码优先部署到他们的本地数据库。 到达那里后,他们使用不同的方法将更改部署到其他计算机,包括TEST 和 PROD,无论是 TSQL 脚本还是数据库备份。
对于甚至没有完成比赛的事情来说,这似乎需要付出很大的努力。