У меня есть несколько существующих таблиц и моделей, которые были настроены вручную, что просто опирается на неявные ассоциации 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)
);
В настоящее время у меня еще есть поля из базового класса в унаследованной таблице. Будет ли сущность определять, что я хочу, если я удалю их или мне нужно сделать что-то еще?
У меня есть учебное пособие по адресу http://weblogs.asp.net/ricardoperes/entity-framework-code-first-inheritance, посмотрите, помогает ли оно. –
Итак, мне просто нужно аннотировать комментарий '[Table (« Name »)]' annotation? – Tevis
Хорошо, я попробовал это, и я думаю, что он почти работает, но он продолжает искать столбец Discriminator, как будто он все еще использует иерархию. – Tevis