我可以在实体框架4.3代码优先更改默认架构名称吗?

Che*_*hev 48 c# sql entity-framework entity-framework-4 ef-code-first

目前我正在将我的应用程序部署到共享托管环境,并且代码优先与迁移一直很有效,除了一个小的打嗝.每次我想推送网站时,我都必须使用"Update-Database -script"选项,因为我必须在每个表名前加上,[dbo]因为默认情况下共享主机会创建一个与数据库用户名同名的默认模式名称.

如果我登录我的共享主机并创建数据库,那么我必须创建一个用户.如果我将该用户命名为admin,则代码优先创建,同时以管理员身份登录,如"[admin].[BlogPosts]".当应用程序运行时,所有表都被创建但我得到了EF异常,因为它说"[dbo].[BlogPosts]"无效.如果我将表的架构名称重命名为"[dbo]"而不是"[admin]"来修复它.

为了解决这个问题,我必须生成一个手动执行的迁移脚本,并在所有表名前添加"[dbo]",因为脚本只按名称引用表,而不是它们的模式和名称.

有没有一种简单的方法来解决这个问题?如果我所要做的就是发布应用程序和一切正常工作,那将是如此美好.如果它不是模式名称的差异,它将是一键式部署,一切都将是光荣的.

小智 131

对于那些使用Entity Framework 6的人,只需使用以下HasDefaultSchema方法:

public class Contexto : DbContext
{
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("MyDefaultDbSchema");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 好极了!我很高兴他们最终加入了原生支持. (4认同)
  • 如果您想完全不使用模式,这也适用于SQLCE.只需使用`String.Empty`. (2认同)
  • 对于那些想知道的人,是的,您可以只添加这一行代码,只要您没有在表上明确设置模式,当您执行“添加迁移”时,它们都会“移动”,然后“更新数据库'。 (2认同)

Era*_*nga 33

您可以使用该ToTable方法指定架构名称.如果未指定模式名称,则按惯例使用EF dbo.

public class MyContext
{
    private string schemaName = "Foo";

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
         modelBuilder.Entity<MyEntity>().ToTable("MyTable", schemaName);
    } 
}
Run Code Online (Sandbox Code Playgroud)

  • 我接受了这个,但我没有使用它.它确实是一个解决方案,但我选择使用easy选项,只使用Damien_The_Unbeliever的选项`ALTER USER admin WITH DEFAULT_SCHEMA = dbo`更改数据库用户的默认模式.现在,默认情况下,dbo下将创建未指定架构的新表. (7认同)
  • 这是一个很好的解决方案.只是糟透了,我必须明确地将每个实体映射到一个表.我有很多.我希望我只能指定一个默认的模式名称.或者我希望如果EF决定使用"dbo",那么它应该在运行SQL时在表名前面显式添加"dbo". (4认同)

Beh*_*lem 8

EF Code first 中,默认情况下,一切都是基于用户访问权限设置的,在 SQL Server 中具有管理访问权限“ DBO-Schema ”。但是,如果特定用户被定义为使用共享主机中常见的数据库,则将不再有 Dbo 管理访问权限。这次我们的表名是dbo.tableName,比如someUser.tableName,这点不准确导致程序无法运行。修改并显式分配连接到数据库的用户。如果使用元数据,则应使用以下方法

[Table("MyTableName", Schema="MySchemaName")]
public class MyClassName
{
 //Other Lines...
}
Run Code Online (Sandbox Code Playgroud)

或者(是否Fluent API可自定义如下:)

modelBuilder.Entity<Blog>().ToTable("MyTableName", schemaName:"MySchemaName");
Run Code Online (Sandbox Code Playgroud)

请注意以下几点: 在此处输入图片说明

一个很好的学习参考:http : //www.c-sharpcorner.com/article/fluent-api-in-code-first-approach/


Bil*_*ill 7

对于数据库第一次实现,它很容易.打开edmx文件,右键单击 - >属性并设置默认数据库模式.

对于代码优先,这篇文章似乎最有希望. http://devproconnections.com/entity-framework/working-schema-names-entity-framework-code-first-design

  • 这个问题与最新版本的 EF 代码优先无关。这只是 EF 4.3 code-first 中的一个问题。我相信5及以上不再有这个问题。 (2认同)