简体   繁体   English

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

[英]Entity Framework SaveChanges not using provided Schema

Assume a (simplified) domain object like this: 假设一个(简化的)域对象,如下所示:

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

Attached to my context in this manner: 以这种方式附加到我的上下文:

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());
    }
}

And mapped like so: 并映射如下:

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

Yet, if I load my object from xml and save it to DB: 但是,如果我从xml加载我的对象并将其保存到DB:

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

I get this error: 我收到此错误:

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

Where dbo should be myschema instead. dbo应该是myschema而不是。

Question

What should I do to make sure the correct schema is used instead of dbo? 我该怎么做才能确保使用正确的架构而不是dbo?

I set the schema specifically on the context and mapping definition, what am I missing? 我在上下文和映射定义中专门设置了模式,我缺少什么?

Looks to be a bug in EF6 , if I set things up the DatAnnotation way instead of Fluent , I can generate the database I want. 看起来是一个错误EF6 ,如果我设置的东西了DatAnnotation方式,而不是Fluent ,我可以生成我想要的数据库。 So I decorate my domain object like so: 所以我像这样装饰我的域对象:

[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; }
}

That fixed it for me. 这为我解决了这个问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM