46

我有一个使用 EF 作为 ORM 的应用程序。数据库曾经有一个模式,dbo,一切正常。我最近将我的表组织成 4 个不同的模式。一个模式的某些表依赖于驻留在不同模式上的表。在 SQL 方面,一切似乎都是有效的。

在应用程序端,所有通过 EF 进行的数据库交互都不再起作用。代码编译,模式在解决方案中可见,模型映射指向正确的模式,但是一旦我尝试向表中插入一行,它就不起作用。

我看过一些关于使用多个模式的帖子需要使用多个 DBContext,但我宁愿使用一个 DBContext。我所有的模式都有相同的所有者 dbo,我没有看到使用多个 DBContext 的原因。

有谁知道是否有办法实现这一目标?

4

5 回答 5

48

您只能通过流畅的映射将每个表映射到其自己的模式。在您的DbContext子类型中,您应该覆盖OnModelCreating(如果您还没有这样做)并添加如下语句:

modelBuilder.Entity<Department>()  
    .ToTable("t_Department", "school");

您没有像这样显式映射的实体将被放置在默认dbo模式中,或者您可以通过以下方式提供自己的默认值

modelBuilder.HasDefaultSchema("sales");

(从这里总结)

于 2016-04-12T20:48:22.140 回答
34

除了 Gert Arnold 的响应之外,您还可以在实体中使用 Table 属性:

using System.ComponentModel.DataAnnotations.Schema;

[Table("t_Department", Schema = "school")]
public class Department
{
    public int Id { get; set; }

    public string Name { get; set; }
}
于 2017-02-04T08:36:40.267 回答
10

@GertArnold 的回答很到位。但是,对于纯语法糖果,您也可以通过约定从模型的名称空间中提取模式来执行此操作。我们发现这对处理多个模式很有用

modelBuilder.Types().Configure(e => {
        var schema = e.ClrType.Namespace.Split('.').Last().ToLower();
        var name = entity.ClrType.Name;
        return entity.ToTable(name, schema);
});

以上将采用命名空间的最后一个组件并将其用作架构名称。这避免了为每个实体定制表绑定的需要。

于 2017-02-04T09:02:33.663 回答
3

好的,您放置了架构或类头等,但是您在哪里定义了该架构?例如:

[Table("Test", Schema = "test1")]
public class Test
{
    public int Id { get; set; }
}

[Table("Test2", Schema = "test2")]
public class Test2
{
    public int Id { get; set; }
}

但是在哪里放置 test1 和 test2?不同的 DbContexts 或在哪里?

于 2019-07-02T10:44:35.837 回答
1

就我而言,我可能使用 DB First 来生成我的 EDMX 文件,因此它不会调用OnModelCreating方法。

我终于删除了所有store:Schema="YourSchema"Schema="YourSchema"EDMX 文件,我通过编写如下bat文件来完成它,并在以下位置powershell command执行:batProjec Pre-Build Event

powershell -Command "$varStr='store:Schema=""abcd""""'; $filePath='%~dp0SomeFolder\SomeFile.edmx'; (gc $filePath) -replace $varStr, '' | Out-File $filePath"
于 2019-10-07T04:13:07.923 回答