@WhiteNinja

Как реализовать Read-only коллекцию при DDD с помощью Entity Framework?

Добрый день, колеги!

Вопрос про Entity Framework и реализацию Read-only коллекции связанных элементов при использовании DDD (Domain Driven Design).

Например есть сущность "отдел" со список должностей в этом отделе:

public class Department
{
	public int DepartmentId { get; private set; }
	public string DisplayName { get; private set; }
	
	// Список должностей в отделе
	protected virtual ICollection<Position> _positions { get; set; }
    public IEnumerable<Position> Positions => _positions.Skip(0);
	public static Expression<Func<Department, ICollection<Position>>> PositionsAccessor = f => f._positions;
	
	public void AddPosition(Position position)
	{
		_positions.Add(position);
	}
	
	....
}

public class Position
{
	public int PositionId { get; private set; }
	public string DisplayName { get; private set; }
	
	public int DepartmentId { get; private set; }
	public virtual Department Department { get; private set; }
	
	...
}


Для маппинга можно использовать:

class DepartmentConfiguration : DbEntityTypeConfiguration<Department>
{
	public DepartmentConfiguration()
	{
		HasKey(x => x.DepartmentId);
		HasMany(Department.PositionsAccessor)
			.WithRequired(x => x.Department)
			.HasForeignKey(x => x.DepartmentId)
			.WillCascadeOnDelete(true);
		
		....
			
		ToTable("Departments");
	}
}


Реализация Read-only списка через статическое поле взято отсюда или отсюда.

Все замечательно, можно делать Include, например:

_dbContext.Set<Department>()
	.Where(x => x.DisplayName.StartWith("Some name"))
	.Include(Department.PositionsAccessor);


Но вопрос: Как реализовать подзапросы к этим самым вложенным элементам. Например нужно получить список отделов, где есть менеджеры.
В таком случае, Linq запрос будет примерно такой:

_dbContext.Set<Department>()
	.Where(x => x.Positions.Any(p => p.TypeId == Enums.PositionType.Manager)) // Это срока выдает Exception, так как Positions не является навигационным полем (им является _positions).
	.Include(Department.PositionsAccessor);


Как реализовать read-only список связанных сущностей, оставив при этом возможность составлять нормальные linq-запросы? Возможно есть какой-то другой хороший подход, помимо static field?

Буду рад любой помощи, заране спасибо!
  • Вопрос задан
  • 402 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы