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)
(从这里总结)
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)
@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)
上面将采用命名空间的最后一个组件并将其用作模式名称.这避免了为每个实体定制表绑定的需要.
| 归档时间: |
|
| 查看次数: |
14432 次 |
| 最近记录: |