使用具有多个数据库架构但使用一个DBContext的实体框架6

Apo*_*nas 29 entity-framework db-schema dbcontext

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

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

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

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

Ger*_*old 31

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

modelBuilder.Entity<Department>()  
    .ToTable("t_Department", "school");
Run Code Online (Sandbox Code Playgroud)

您未明确映射的实体将被置于默认dbo架构中,或者您可以提供自己的默认架构

modelBuilder.HasDefaultSchema("sales");
Run Code Online (Sandbox Code Playgroud)

(从这里总结)

  • 我不知道在此期间它是否发生了变化,或者我是公然不正确的,但是*仅**它不是流利的映射。您也可以使用数据注解,[[Table(“ t_Department”,Schema =“ school”)]]。 (2认同)

Sta*_*cev 20

除了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; }
}
Run Code Online (Sandbox Code Playgroud)


Not*_*ple 8

@GertArnold的回答很明显.但是对于纯语法糖果,您也可以通过约定从模型的命名空间中提取模式.我们发现这对处理多个模式很有用

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

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

  • 你能详细说明一下或者给出一个更完整的例子吗? (2认同)