9

Tôi đang sử dụng Entity Framework 4.3 với mã di chuyển đầu tiên và thủ công. Tôi đang cố gắng để bản đồ một thiết lập TPH (table-per-hierarchy) trong đó sử dụng hai lĩnh vực phân biệt đối xử tùy chỉnh. Một cho chính phân biệt đối xử và phần còn lại cho xóa mềm (giống như tùy chọn "where" trong ánh xạ lớp NH). Thiết lập chính xác tương tự chỉ hoạt động tốt trong một dự án khác chạy trên EF 4.2.Khuôn khổ thực thể 4.3 - Lỗi lập bản đồ và di chuyển TPH

Tôi gặp lỗi khi cố gắng thêm di chuyển bằng cách sử dụng lệnh "thêm di chuyển" trong bảng điều khiển NuGet. Tôi đã thử tất cả các kết hợp của việc xác định tên bảng - thuộc tính trên lớp, trong "OnModelCreating" phương pháp, trong các lớp EntityTypeConfiguration vv Di chuyển trước đó của tôi mà không liên quan đến ánh xạ phân cấp phức tạp đã làm việc tốt.

Có một số thay đổi đột phá trong EF 4.3 mà tôi đã tình cờ gặp phải không?

Mã:

//---- Domain classes --------------------- 

public abstract class ParentClass 
{ 
    public string ParentString { get; set; } 
} 

public class Foo : ParentClass 
{ 
    public string FooString { get; set; } 
} 

public class Bar : ParentClass 
{ 
    public string BarString { get; set; } 
} 

//---- Mapping configuration -------------- 

public class ParentConfiguration : EntityTypeConfiguration<ParentClass> 
{ 
    public ParentConfiguration() 
    { 
     Map<Foo>(m => 
     { 
      m.Requires("IsActive").HasValue(1); 
      m.Requires("Type").HasValue("Foo"); 
     }) 
     .ToTable("Parent"); 

     Map<Bar>(m => 
     { 
      m.Requires("IsActive").HasValue(1); 
      m.Requires("Type").HasValue("Bar"); 
     }) 
     .ToTable("Parent"); 
    } 
} 

//---- Context ---------------------------- 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Configurations.Add(new ParentConfiguration()); 
} 

Lỗi:

System.InvalidOperationException: The type 'Foo' has already been mapped to table 'Parent'. Specify all mapping aspects of a table in a single Map call. 
    at System.Data.Entity.ModelConfiguration.Configuration.Types.EntityTypeConfiguration.AddMappingConfiguration(EntityMappingConfiguration mappingConfiguration) 
    at System.Data.Entity.ModelConfiguration.Configuration.ModelConfiguration.ReassignSubtypeMappings() 
    at System.Data.Entity.DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo) 
    at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection) 
    at System.Data.Entity.Infrastructure.EdmxWriter.WriteEdmx(DbContext context, XmlWriter writer) 
    at System.Data.Entity.Migrations.Extensions.DbContextExtensions.<>c__DisplayClass1.<GetModel>b__0(XmlWriter w) 
    at System.Data.Entity.Migrations.Extensions.DbContextExtensions.GetModel(Action`1 writeXml) 
    at System.Data.Entity.Migrations.Extensions.DbContextExtensions.GetModel(DbContext context) 
    at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration, DbContext usersContext) 
    at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration) 
    at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.GetMigrator() 
    at System.Data.Entity.Migrations.Design.ToolingFacade.GetPendingMigrationsRunner.RunCore() 
    at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run() 

Mihkel

Trả lời

12

Đây là một vấn đề được biết đến với 4.3 và 4.3.1. (Chúng tôi đã tìm thấy nó quá muộn để đặt bản sửa lỗi trong 4.3.1.) May mắn thay, có một cách khá đơn giản để thay đổi mã của bạn nên làm cho nó hoạt động.

Tóm lại, bạn đã sử dụng để có thể thực hiện cuộc gọi bản đồ chuỗi trên một EntityConfiguration trong 4.1. và 4.2. Một cái gì đó giống như mẫu này:

modelBuilder.Entity<Parent>() 
    .Map<Foo>(...) 
    .Map<Bar>(...); 

Điều này không hoạt động trong 4.3 và thay vào đó bạn phải làm cho mỗi Bản đồ gọi trên thực thể cấu hình cho thực thể đó. Vì vậy, một cái gì đó kiểu như thế này:

modelBuilder.Entity<Foo>() 
    .Map<Foo>(...); 

modelBuilder.Entity<Bar>() 
    .Map<Bar>(...); 

Lấy trường hợp của bạn đặc biệt, điều này sẽ làm việc:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<ParentClass>() 
     .ToTable("Parent"); 

    modelBuilder.Entity<Foo>() 
     .Map(m => 
       { 
        m.Requires("IsActive").HasValue(1); 
        m.Requires("Type").HasValue("Foo"); 
       }); 

    modelBuilder.Entity<Bar>() 
     .Map(m => 
       { 
        m.Requires("IsActive").HasValue(1); 
        m.Requires("Type").HasValue("Bar"); 
       }); 
} 

(Tôi đã gỡ bỏ một vài trong số các thông số chung chung vì chúng không cần thiết, nhưng đó là . không quan trọng)

Việc làm này sử dụng EntityConfigurations rõ ràng bạn sẽ sử dụng một cái gì đó như thế này:

public class ParentConfiguration : EntityTypeConfiguration<ParentClass> 
{ 
    public ParentConfiguration() 
    { 
     ToTable("Parent"); 
    } 
} 

public class FooConfiguration : EntityTypeConfiguration<Foo> 
{ 
    public FooConfiguration() 
    { 
     Map(m => 
     { 
      m.Requires("IsActive").HasValue(1); 
      m.Requires("Type").HasValue("Foo"); 
     }); 
    } 
} 

public class BarConfiguration : EntityTypeConfiguration<Bar> 
{ 
    public BarConfiguration() 
    { 
     Map(m => 
     { 
      m.Requires("IsActive").HasValue(1); 
      m.Requires("Type").HasValue("Bar"); 
     }); 
    } 
} 

Và sau đó

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Configurations 
     .Add(new ParentConfiguration()) 
     .Add(new FooConfiguration()) 
     .Add(new BarConfiguration()); 
} 

Chúng tôi dự định khắc phục điều này trong 5.0.

+0

Cảm ơn bạn, điều này chỉ là những gì tôi muốn. Và theo một cách kỳ lạ cảm thấy đúng - rõ ràng hơn - một cấu hình cho mỗi loại phụ. Mặc dù khả năng tương thích ngược sẽ tốt đẹp và tôi hy vọng điều này sẽ được khắc phục trong các bản phát hành trong tương lai. – Mihkel

+2

Đây là trễ 3 năm, nhưng các cuộc gọi tới 'Bản đồ (m => m.Requires ...' sẽ chỉ hoạt động nếu nó được thực hiện ** TRƯỚC KHI ** cuộc gọi đến 'ToTable (" tên bảng ")'. Khuôn khổ thực thể 6.1.3 btw. –

Các vấn đề liên quan