实体框架SaveChanges不使用提供的架构

时间:2019-06-04 09:53:42

标签: c# sql-server entity-framework-6

假设这样的(简化的)域对象:

public class MyObject
{
    public Guid Id { get; set; }
    public String Field1 { get; set; }
    public String Field2 { get; set; }
}

以这种方式附加到我的上下文中:

public class MyDbContext : DbContext
{
    public DbSet<MyObject> MyObjects { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("myschema");

        modelBuilder.Configurations
            .AddFromAssembly(Assembly.GetExecutingAssembly());

        modelBuilder.Conventions
            .AddFromAssembly(Assembly.GetExecutingAssembly());
    }
}

并这样映射:

public class MyObjectMapping : EntityTypeConfiguration<MyObject>
{
    public MyObjectMapping()
    {
        ToTable("MyObject", "myschema");
        HasKey(x => x.Id);
    }
}

但是,如果我从xml加载对象并将其保存到DB:

var myObject = MyObjects.FromXml(xmlFilepath).ToDomain();
var context = new MyDbContext();
context.MyObjects.Add(myObject);
context.SaveChanges();

我收到此错误:

  

System.Data.SqlClient.SqlException无效的对象名称   'dbo.MyObjects'。

dbo应该改为myschema

问题

  

我该怎么做以确保使用正确的架构而不是   dbo?

我专门根据上下文和映射定义设置了架构,我缺少什么?

1 个答案:

答案 0 :(得分:0)

EF6中似乎是一个错误,如果我以DatAnnotation的方式而不是Fluent进行设置,则可以生成所需的数据库。所以我像这样装饰我的域对象:

[Table("MyObject", Schema = "myschema")]
public class MyObject
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    public Guid Id { get; set; }
    public String Field1 { get; set; }
    public String Field2 { get; set; }
}

那为我解决了。