实体框架TPC中的自有属性类型

时间:2018-12-27 06:34:19

标签: c# entity-framework properties tpc

在我的最后一个问题不太详细之后,我尝试确切地解释我所面临的问题。

首先概述所有涉及的模型类:

public abstract class RecordBase 
{ 
    public int Id { get; set; }
}

public abstract class Record : RecordBase
{
    public DateTime CreateDate { get; set; }
    public int CreateUserId { get; set; }
    public virtual User CreateUser { get; set; }
}

public class User : RecordBase
{
    public string Username { get; set; }
}

public class Company : Record
{
    public string CompanyName { get; set; }
    public RecordReference FoundedByContact { get; set; }
}

public class Contact : Record
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

public class RecordReference
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual RecordBase Record { get; set; }

    public RecordReference(RecordBase record)
    {
        Record = record;
        Id = record.Id;
        Name = record.ToString();
    }
}

OnModelCreation方法如下:

mb.Conventions.Remove<PluralizingEntitySetNameConvention>();
mb.Conventions.Remove<PluralizingTableNameConvention>();
mb.Conventions.Add<MappingInheritedPropertiesSupportConvention>();

mb.Entity<RecordBase>().Property(r => r.Id).IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

mb.Entity<Contact>().Map(r => {
    r.MapInheritedProperties();
    r.ToTable("Contacts");
});

mb.Entity<Company>().Map(r =>
{
    r.MapInheritedProperties();
    r.ToTable("Companies");
});

mb.Entity<User>().Map(r =>
{
    r.MapInheritedProperties();
    r.ToTable("Users");
});

使用Update-Database -Script构建数据库脚本时,将创建表Companies和附加表RecordReference

CREATE TABLE [dbo].[Companies] 
(
    [Id] [INT] NOT NULL IDENTITY,
    [FoundedByContact_Id] [INT],
    [CreateDate] [DATETIME] NOT NULL,
    [CreateUserId] [INT] NOT NULL,
    [CompanyName] [NVARCHAR](MAX),

    CONSTRAINT [PK_dbo.Companies] PRIMARY KEY ([Id])
)

CREATE TABLE [dbo].[RecordReference] 
(
    [Id] [INT] NOT NULL IDENTITY,
    [Name] [NVARCHAR](MAX),
    [Record_Id] [INT],

    CONSTRAINT [PK_dbo.RecordReference] PRIMARY KEY ([Id])
)

此外,还有多个外键等等……我不需要这种方式。

在此示例中,我想实现Companies表将获得两个附加字段,如FoundedByContact_IdFoundedByContact_Name来存储信息。

出于我的目的,不需要表RecordReferences

顺便说一句-我正在使用TPC,如果直接用于查询,则数据库表看起来更“合乎逻辑”。

从编程的角度来看,我当然可以删除所有继承设置,而不关心表的设计。

基本上,类RecordReference仅应用作“自定义属性类型”,而不是在公司类中创建3个属性。

背后的想法是简化使用Web Api在使用DTO的环境中存储引用记录名称的方法,以此类推,并不是在所有情况下都传输引用记录本身-但至少应提供其名称。

我希望,这次将按需要进行详细介绍。

感谢您提供解决方案的任何提示...

关于马库斯

0 个答案:

没有答案