Проблемы наследования интерфейса в отношениях один-ко-многим в Entity Framework - PullRequest
1 голос
/ 05 ноября 2010

У меня есть модель домена, определяющая интерфейсы или мой домен, и я использую DI, чтобы подключить ее к реализации репозитория Entity Framework 4. В моем домене у меня есть следующее:

public interface IInboundGateway : IGateway
{
    ICollection<IInboundNumber> InboundNumbers { get; set; }
}

Затем у меня есть модель инфраструктуры сущностей, сгенерировавшая класс InboundGateway:

public partial class InboundGateway : EntityObject
{
    public EntityCollection<InboundNumber> InboundNumbers { get; set; }
}

Для реализации интерфейса IInboundGateway я создал частичный класс InboundGateway.

public partial class InboundGateway : IInboundGateway
{
}

Eventhough EntityCollection <> реализует ICollection <>, а InboundNumber реализует IInboundNumber. Я получаю сообщение об ошибке, что InboundGateway не реализует интерфейс IInboundGateway.InboundNumbers, потому что InboundGateway.InboundNumbers не имеет соответствующий тип возврата ICollection<IInboundNumber>

Я почти уверен, что это умственно, поскольку EntityCollection реализует ICollection, а InboundNumber реализует IInboundNumber.

Спасибо за любую помощь, спасибо.

1 Ответ

1 голос
/ 05 ноября 2010

Вы должны знать, что EntityCollection<InboundNumber> является подтипом ICollection<InboundNumber>, но НЕ подтипом ICollection<IInboundNumber>. Это 2 разных типа и не связаны между собой.

поэтому в классе объекта сущности у вас есть:

public EntityCollection<InboundNumber> InboundNumbers { get; set; }

Пока составитель ожидает, что вы получите:

public ICollection<IInboundNumber> InboundNumbers { get; set; }


Если бы вы могли превратить ваши объекты EntityObject в POCO, часть проблемы была бы решена, поскольку классы POCO по умолчанию используют ICollection для своих навигационных свойств. Кроме того, вам нужно изменить свой интерфейс следующим образом:

public interface IInboundGateway : IGateway {
    ICollection InboundNumbers { get; set; }
}
...