Несколько объектов к одному и тому же DbSet - PullRequest
2 голосов
/ 07 января 2020

Допустим, у меня есть два разных класса. Они имеют некоторые свойства, но также имеют некоторые индивидуальные свойства.

public class A
{
    // Shared properties
    public int Id { get; set; }
    public DateTime CreatedDtm { get; set; }
    public string CreatedBy { get; set; }

    // Individual properties
    public string PhoneNumber { get; set; }
    public string EmailAddress { get; set; }
}

public class B
{
    // Shared properties
    public int Id { get; set; }
    public DateTime CreatedDtm { get; set; }
    public string CreatedBy { get; set; }

    // Individual properties
    public string StreetAddress { get; set; }
    public string PostalCode{ get; set; }
    public string City{ get; set; }
}

Теперь дело в том, что я хотел бы сохранить эти два типа как одну и ту же сущность. Это возможно, если я преобразую отдельные свойства в JSON. Таким образом, я мог бы создать общую сущность, как это:

public class C
{
    // Shared properties
    public int Id { get; set; }
    public DateTime CreatedDtm { get; set; }
    public string CreatedBy { get; set; }

    // Individual properties
    public object IndividualProperties { get; set; }
}

Но если я это сделаю, я потеряю все преимущества языка с типизацией stati c, а также все преимущества полиморфизма, делая это (например, class A может иметь некоторые отличия от class B).

Нет ли способа выполнить преобразование непосредственно перед сохранением объекта через Entity Framework (Core)? Конечно, я мог бы написать отображение самостоятельно, но у меня было ощущение, что здесь должен быть ярлык ...

По сути, я хочу сделать что-то подобное (не важно, интерфейс это, абстрактный класс или что-то совсем другое):

public void AddEntity(ISomeSharedInterface entity) 
{
    C sharedEntity = SomeMappingMethod(entity);
    db = new Context();
    db.SharedEntities.Add(sharedEntity);
    db.SaveChanges();
}

Если вас интересует этот дизайн, он предназначен для процесса автоматизации. Различные формы, которые необходимо заполнить в процессе, различаются, но я хотел бы сохранить все элементы в одной таблице.

1 Ответ

2 голосов
/ 07 января 2020

Если вы создаете абстрактный базовый класс, он должен просто работать без какой-либо дополнительной настройки:

public abstract class Base
{
    // Shared properties
    public int Id { get; set; }
    public DateTime CreatedDtm { get; set; }
    public string CreatedBy { get; set; }
}

public class A : Base
{
    // Individual properties
    public string PhoneNumber { get; set; }
    public string EmailAddress { get; set; }
}

public class B : Base
{
    // Individual properties
    public string StreetAddress { get; set; }
    public string PostalCode{ get; set; }
    public string City{ get; set; }
}

class Context : DbContext
{
    DbSet<Base> Bases { get; set; }
}

public void AddEntity(Base entity) 
{
    using (db = new Context())
    {
        db.Bases.Add(entity);
        db.SaveChanges();
    }
}

Дополнительная информация здесь .

...