0

У меня есть несколько существующих таблиц и моделей, которые были настроены вручную, что просто опирается на неявные ассоциации Entity. У меня нет файлов edmx или дизайнеров или мастеров сопоставления.Ручная настройка таблицы Entity Framework для каждого типа наследования

Я хотел бы создать ассоциацию наследования по таблице для каждого типа, чтобы я мог иметь базовый класс, представленный одной таблицей, а затем иметь дополнительные таблицы, представляющие дополнительные поля для унаследованных классов. Есть ли способ сделать это с помощью только моделей и таблиц. По умолчанию Entity пытается получить доступ к структуре как таблицу для иерархии и выдает ошибку, потому что унаследованные члены класса не присутствуют в таблице, которая представляет базовый класс.

Так, например:

public class FormBase 
{ 
    [Key] 
    public long Id { get; set; } 

    public int UserId { get; set; } 

    public string FormType { get; set; } 

    public int Status { get; set; } 

    public int? Hidden { get; set; } 

    public DateTime DateSubmitted { get; set; } 

    public DateTime DateFinalized { get; set; } 
} 

CREATE TABLE [dbo].[FormBases] (
    [Id]   BIGINT   IDENTITY (1, 1) NOT NULL, 
    [UserId]  INT   NOT NULL, 
    [FormType]  NVARCHAR (100) NOT NULL, 
    [Status]  INT   DEFAULT ((0)) NOT NULL, 
    [Hidden]  INT   DEFAULT ((0)) NOT NULL, 
    [DateSubmitted] DATETIME2 (7) NULL, 
    [DateFinalized] DATETIME2 (7) NULL, 
    PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

public class CheckRequestModel : FormBase 
{ 
    [Display(Name="Requester Name")] 
    public string RequestorName { get; set; } 
    [Display(Name="Phone Number")] 
    public string PhoneNumber { get; set; } 
    [Display(Name="E-mail")] 
    public string Email { get; set; } 
    [Display(Name="Name")] 
    public string PayToName { get; set; } 
    [Display(Name="Address")] 
    public string PayToAddress { get; set; } 
    [Display(Name="City")] 
    public string PayToCity { get; set; } 
    [Display(Name="State")] 
    public string PayToState { get; set; } 
    [Display(Name="Zip")] 
    public int PayToZip { get; set; } 

    public bool ReceiptAttached { get; set; } 

    [Display(Name="Receipt")] 
    public Attachment Receipt { get; set; } 

    [ForeignKey("Receipt")] 
    public long? ReceiptId { get; set; } 

    public bool InvoiceAttached { get; set; } 
    [Display(Name="Invoice")] 
    public Attachment Invoice { get; set; } 

    [ForeignKey("Invoice")] 
    public long? InvoiceId { get; set; } 

    [Display(Name="Date")] 
    public DateTime? Date { get; set; } 

    [Display(Name="Total Amount")] 
    [DataType(DataType.Currency)] 
    public Decimal? TotalAmount { get; set; } 

    [Display(Name="Purchase Requisition Type")] 
    public string PurchaseRequisitionType { get; set; } 

    [Display(Name="Purpose Description")] 
    public string PurposeDescription { get; set; } 

    [Display(Name="Allocations")] 
    public List<AllocationInformation> Allocations { get; set; } 

    [Display(Name="Allocation Total")] 
    [DataType(DataType.Currency)] 
    public Decimal? AllocationTotal { get; set; } 
} 


CREATE TABLE [dbo].[CheckRequestModels] (
    [Id]      BIGINT   IDENTITY (1, 1) NOT NULL, 
    [UserId]     INT   NOT NULL, 
    [Status]     INT   NOT NULL, 
    [DateSubmitted]   DATETIME2 (7) NULL, 
    [DateFinalized]   DATETIME2 (7) NULL, 
    [FormType]    NVARCHAR (MAX) DEFAULT ('CheckRequest') NULL, 
    [Hidden]     INT   NULL, 
    [RequestorName]   NVARCHAR (MAX) NOT NULL, 
    [PhoneNumber]    NVARCHAR (MAX) NOT NULL, 
    [Email]     NVARCHAR (MAX) NOT NULL, 
    [PayToName]    NVARCHAR (MAX) NOT NULL, 
    [PayToAddress]   NVARCHAR (MAX) NOT NULL, 
    [PayToCity]    NVARCHAR (MAX) NOT NULL, 
    [PayToState]    NVARCHAR (MAX) NOT NULL, 
    [PayToZip]    INT   NOT NULL, 
    [ReceiptAttached]   BIT   DEFAULT ((0)) NOT NULL, 
    [InvoiceAttached]   BIT   DEFAULT ((0)) NOT NULL, 
    [Date]     DATETIME2 (7) NOT NULL, 
    [TotalAmount]    DECIMAL (18) NOT NULL, 
    [PurchaseRequisitionType] NVARCHAR (MAX) NOT NULL, 
    [PurposeDescription]  NVARCHAR (MAX) NOT NULL, 
    [AllocationTotal]   DECIMAL (18) NOT NULL, 
    [InvoiceId]    INT   NULL, 
    [ReceiptId]    INT   NULL, 
    PRIMARY KEY CLUSTERED ([Id] ASC) 
); 

В настоящее время у меня еще есть поля из базового класса в унаследованной таблице. Будет ли сущность определять, что я хочу, если я удалю их или мне нужно сделать что-то еще?

+0

У меня есть учебное пособие по адресу http://weblogs.asp.net/ricardoperes/entity-framework-code-first-inheritance, посмотрите, помогает ли оно. –

+0

Итак, мне просто нужно аннотировать комментарий '[Table (« Name »)]' annotation? – Tevis

+0

Хорошо, я попробовал это, и я думаю, что он почти работает, но он продолжает искать столбец Discriminator, как будто он все еще использует иерархию. – Tevis

ответ

0

Укажите DbSet как набор абстрактного типа, а затем сопоставить производный тип в другой таблице:

public class MyDbContext : DbContext 
{ 
    public DbSet<FormBase> Forms { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<CheckRequestModel>().Map(r => { 
      r.ToTable("CheckRequests"); 
     }); 
    } 
} 

Это будет делать трюк.

Смежные вопросы