2016-01-28 12 views
6

Tôi đang sử dụng EF 6 và sử dụng chiến lược TPT để mô hình hóa vấn đề của mình. Rule là lớp trừu tượng. OvertimeRule là một lớp bê tông, kế thừa từ Rule.EF và TPT: tên cột được chỉ định nhiều lần trong mệnh đề SET

Rule trông như thế này:

public abstract class Rule 
{ 
    public int Id { get; set; } 
    public PeriodType PeriodType { get; set; } 
    public int SortOrder { get; set; } 
    public int StatuteId { get; set; } 
    public bool IsActive { get; set; } 
} 

OvertimeRule trông như thế này:

public partial class OvertimeRule : Rule 
{ 
    public decimal? ThresholdCoefficient { get; set; } 
    public decimal? LimitCoefficient { get; set; } 
} 

Khi tôi tạo ra một mới OvertimeRule và cố gắng tiết kiệm nó, EF đầu tiên tạo ra truy vấn này:

INSERT [dbo].[Rules]([PeriodType], [SortOrder], [StatuteId], [IsActive], [StatuteID]) 
VALUES (@0, @1, @2, @3, @4, @5, @6, NULL) 

Như bạn có thể thấy, EF thêm StatuteID cột để chèn, mà không tồn tại bất cứ nơi nào trong các giải pháp và làm cho điều này một truy vấn SQL không hợp lệ.

SQL sau đó đúng là ném: The column name 'StatuteId' is specified more than once in the SET clause. A column cannot be assigned more than one value in the same SET clause. Modify the SET clause to make sure that a column is updated only once. If the SET clause updates columns of a view, then the column name 'StatuteId' may appear twice in the view definition.

Việc lập bản đồ trông như thế này:

 modelBuilder.Entity<Rule>().ToTable("Rules", TimmiSchemaName); 
     modelBuilder.Entity<Rule>().HasRequired(s => s.Statute).WithMany(s => s.Rules).HasForeignKey(r => r.StatuteId); 
     modelBuilder.Entity<OvertimeRule>().ToTable("OverTimeRules", TimmiSchemaName); 

bất cứ ai có thể cho tôi biết những gì có thể kích hoạt hành vi này?

+0

Hiện nét OvertimeRule của bạn xin vui lòng – tede24

+0

thực hiện. Không có gì thú vị để xem thực sự ở đây .. –

Trả lời

1

Điều này rất phức tạp.

modelBuilder.Entity<Rule>().HasRequired(s => s.Statute).WithMany().HasForeignKey(r => r.StatuteId); 

thực sự là không chính xác, và cần phải có được

modelBuilder.Entity<Rule>().HasRequired(s => s.Statute).WithMany(s => s.Rules).HasForeignKey(r => r.StatuteId); 

là tài sản statute.Rules tồn tại ở phía bên kia của khóa ngoại.

Không có nó, EF cố gắng tự động ánh xạ thuộc tính vào cột sql từ bảng Quy tắc, mà anh đoán là StatuteID.

+0

Chỉnh sửa bài đăng của bạn thay vì xin vui lòng, câu trả lời cho câu trả lời –

+1

Tôi khá chắc chắn rằng tôi đã làm theo hướng dẫn tại đây http://stackoverflow.com/help/self-answer –

+1

Oh đã không nhận ra điều này giải quyết vấn đề của bạn, xấu của tôi –

1

tôi thấy hai chuyen la mã mà bạn cung cấp:

1)

modelBuilder.Entity<Rule>().HasRequired(s => s.Statute)... 

Phần này nói tài sản Statute là cần thiết trong Rule, tuy nhiên nó là hư không để được nhìn thấy. Làm thế nào điều này thậm chí biên dịch?

2)

modelBuilder.Entity<Rule>().ToTable("Rules", TimmiSchemaName); 

Mấu chốt của TPT là bạn sử dụng một trong các bảng của bạn như là một lớp trừu tượng có nghĩa là bạn sẽ sử dụng bảng cho các mô hình mà lấy được từ nó. Bạn không thể tìm nạp Quy tắc nhưng bạn có thể tìm nạp OverTimeRule Quy tắc. Điều quan trọng là khóa chính của các bảng có nguồn gốc là khóa chính tương tự chính của bảng cơ sở của bạn.lớp ngữ cảnh của bạn nên tìm một cái gì đó như thế này:

public class MyContext : DbContext 
{ 
    public DbSet<Rule> Rules {get; set;} 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<OverTimeRule>().ToTable("OverTimeRules"); 
     ... 
    } 
} 

bài viết Thực sự tuyệt vời ở đây: http://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt

+0

1: Tôi đã không đề cập đến nó trong câu hỏi, nhưng nó thực sự tồn tại. 2: Bạn đang nói rằng 'modelBuilder.Entity (). ToTable (" Rules ", TimmiSchemaName);' là vô ích? Bởi vì nếu không, tôi tôn trọng những gì bài viết gợi ý :) –

+0

Thật vậy, có thể sẽ không ném ngoại lệ hoặc bất cứ điều gì nếu bạn có nó, nhưng đối với TPT nó không phải được định nghĩa. –

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