Собственный тип свойства в Entity Framework TPC - PullRequest
0 голосов
/ 27 декабря 2018

После того, как мой последний вопрос был менее подробным, я пытаюсь точно объяснить, с какой проблемой я сталкиваюсь.

Сначала краткий обзор всех задействованных классов моделей:

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 свойств в классе компании.

Идея состоит в том, чтобы упростить способ хранения имени ссылочных записей в среде, использующей DTO, с использованием Web Api и т. д., где указанная записьсам по себе не передается во всех случаях - но, по крайней мере, его имя должно быть доступно.

Надеюсь, на этот раз он описан настолько подробно, насколько это необходимо.

Спасибо за любой намек на решение по этому вопросу....

С уважением, Маркус

...