在我的最后一个问题不太详细之后,我尝试确切地解释我所面临的问题。
首先概述所有涉及的模型类:
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_Id
和FoundedByContact_Name
来存储信息。
出于我的目的,不需要表RecordReferences
。
顺便说一句-我正在使用TPC,如果直接用于查询,则数据库表看起来更“合乎逻辑”。
从编程的角度来看,我当然可以删除所有继承设置,而不关心表的设计。
基本上,类RecordReference
仅应用作“自定义属性类型”,而不是在公司类中创建3个属性。
背后的想法是简化使用Web Api在使用DTO的环境中存储引用记录名称的方法,以此类推,并不是在所有情况下都传输引用记录本身-但至少应提供其名称。
我希望,这次将按需要进行详细介绍。
感谢您提供解决方案的任何提示...
关于马库斯