Вопрос:

Явно отображать член интерфейса в Entity Framework 7

c# entity-framework entity-framework-core

2673 просмотра

1 ответ

402 Репутация автора

Я пытаюсь отобразить класс, который выглядит следующим образом, но я получаю исключение относительно свойства Facility.Projects, являющегося интерфейсом.

Свойство Facility.Projects имеет тип интерфейса IProject. Если это свойство навигации, вручную настройте отношение для этого свойства, приведя его к сопоставленному типу сущности, в противном случае игнорируйте свойство из модели.

public class Facility : BaseData
{
    [ForeignKey("ClientId")]
    public Client Owner { get; set; }

    public List<IProject> Projects { get; protected set; }

    public Facility()
    {
        Initialize();
    }

    private void Initialize()
    {
        Projects = new List<IProject>();
    }
}

Я сопоставил другие свойства с помощью OnModelCreatingметода для класса DbContext, который Facilityсопоставлен, но на самом деле я не вижу ничего, что кажется правильным местом для приведения этого другого, кроме того, HasColumnTypeкоторое также кажется неправильным.

public class FacilityRepository : BaseRepository<Facility>, IFacilityRepository
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder
            .Entity<Client>()
            .Property(f => f.Id)
            .ForSqliteHasColumnName("ClientId");

        modelBuilder
            .Entity<Project>()
            .Property(x => x.Id)
            .ForSqliteHasColumnName("ProjectId");


        // area where I've tried and failed to find a good spot to do some manual casting
        modelBuilder
            .Entity<Facility>()
            .Property(f => f.Projects)
            .HasColumnType<Project>(new PropertyBuilder());
    }
}

Может кто-то указать мне верное направление? Я не видел в документации ничего, что могло бы помочь? Или я, по правилу, вообще не должен этим заниматься?

Автор: prestonsmith Источник Размещён: 22.08.2016 08:47

Ответы (1)


3 плюса

718 Репутация автора

Решение

Чтобы выполнить ручное отображение отношения один-ко-многим (в этом примере показано только отображение дочерних элементов на родительском элементе, а не наоборот), вы можете настроить это следующим образом, и тогда довольно просто, где должно быть приведение:

        modelBuilder.Entity<ProjectState>()
            .HasMany(h => (ICollection<ProjectRoleState>)h.ProjectRoleStates)
            .WithOne()
            .HasForeignKey(p=>p.ProjectGuid);
Автор: Arwin Размещён: 28.01.2017 08:08
Вопросы из категории :
32x32