Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按类型继承手动设置实体框架的表_C#_Asp.net Mvc_Entity Framework_Inheritance_Table Per Type - Fatal编程技术网

C# 按类型继承手动设置实体框架的表

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; }

我有一些现有的表和模型是手动设置的,这仅仅依赖于实体的隐式关联。我没有edmx文件、设计器或映射向导

我想按每种类型的表设置一个继承关联,这样我就可以用一个表表示基类,然后用其他表表示继承类的其他字段。有没有一种方法,我可以做到这一点,只是模型和表格。默认情况下,实体尝试按层次结构以表的形式访问结构,并抛出错误,因为继承的类成员不存在于表示基类的表中

例如:

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]注释就可以了?好的,我试过了,我认为它几乎可以工作了,但它一直在寻找一个鉴别器列,好像它仍然在使用层次结构。