C# 按类型继承手动设置实体框架的表
我有一些现有的表和模型是手动设置的,这仅仅依赖于实体的隐式关联。我没有edmx文件、设计器或映射向导 我想按每种类型的表设置一个继承关联,这样我就可以用一个表表示基类,然后用其他表表示继承类的其他字段。有没有一种方法,我可以做到这一点,只是模型和表格。默认情况下,实体尝试按层次结构以表的形式访问结构,并抛出错误,因为继承的类成员不存在于表示基类的表中 例如:C# 按类型继承手动设置实体框架的表,c#,asp.net-mvc,entity-framework,inheritance,table-per-type,C#,Asp.net Mvc,Entity Framework,Inheritance,Table Per Type,我有一些现有的表和模型是手动设置的,这仅仅依赖于实体的隐式关联。我没有edmx文件、设计器或映射向导 我想按每种类型的表设置一个继承关联,这样我就可以用一个表表示基类,然后用其他表表示继承类的其他字段。有没有一种方法,我可以做到这一点,只是模型和表格。默认情况下,实体尝试按层次结构以表的形式访问结构,并抛出错误,因为继承的类成员不存在于表示基类的表中 例如: public class FormBase { [Key] public long Id { get; set; }
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)
);
目前,我在继承的表中仍然有基类中的字段。如果我删除这些数据,entity会知道我想要什么吗?或者我需要做其他事情吗?将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");
});
}
}
这就可以了。我在上有一个教程,看看它是否有用。好的,所以我只需要用[TableName]注释就可以了?好的,我试过了,我认为它几乎可以工作了,但它一直在寻找一个鉴别器列,好像它仍然在使用层次结构。