我有一个使用EF作为ORM的应用程序。数据库曾经有一个架构,dbo,一切都运行正常。我最近将我的表组织成4种不同的模式。一个模式的某些表依赖于驻留在不同模式上的表。所有这些似乎都在SQL方面有效。
在应用程序方面,通过EF的所有数据库交互都不再有效。代码编译,模式在解决方案中可见,模型映射指向正确的模式,但是一旦我尝试向表中插入行,它就不起作用。
我看过一些关于使用多个模式的帖子需要使用多个DBContexts,但我宁愿使用一个DBContext。我的所有模式都拥有相同的所有者dbo,我没有看到使用多个DBContexts的原因。
有没有人知道是否有办法实现这一目标?
答案 0 :(得分:27)
您只能通过流畅映射将每个表映射到自己的架构。在DbContext
子类型中,您应该覆盖OnModelCreating
(如果您还没有这样做)并添加如下语句:
modelBuilder.Entity<Department>()
.ToTable("t_Department", "school");
您未明确映射的实体将被置于默认的dbo
架构中,或者您可以通过
modelBuilder.HasDefaultSchema("sales");
(摘自here)
答案 1 :(得分:18)
除了Gert Arnold的回应之外,您还可以在实体中使用Table属性:
Layout
答案 2 :(得分:7)
@GertArnold的回答很明显。但是对于纯语法糖果,您也可以通过约定从模型的命名空间中提取模式。我们发现这有用处理多个模式
modelBuilder.Types().Configure(e => {
var schema = e.ClrType.Namespace.Split('.').Last().ToLower();
var name = entity.ClrType.Name;
return entity.ToTable(name, schema);
});
上面将采用命名空间的最后一个组件并将其用作模式名称。这样就无需为每个实体定制表绑定。
答案 3 :(得分:0)
好的,您将架构放在类头等中,但是在哪里定义该架构?例如:
[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放在哪里?不同的DbContext还是在哪里?
答案 4 :(得分:0)
就我而言,可能是我使用DB First来生成我的EDMX文件,因此它不调用OnModelCreating
方法。
我最终删除了EDMX文件中的所有store:Schema="YourSchema"
和Schema="YourSchema"
,并通过如下所示用bat
编写了一个powershell command
文件并执行了{{1 }}中的bat
:
Projec Pre-Build Event