Несовершенное решение состоит в том, чтобы просто объединить эти интерфейсы, которые вы хотите сохранить, в базовые классы и разбить базовые объекты на подклассы. EF поддерживает это, и если вы используете Table Per Hierarchy (по умолчанию), вы можете отсортировать все нижележащие подклассы объектов по общему свойству, используя обычный запрос LINQ из EF, вместо того, чтобы быть хитрым и делать что-то наподобие write raw SQL или получить несколько списков в памяти и отсортировать объединение без помощи БД, как если бы вы использовали решение Cel для интерфейсов и адаптеров.
Вы также можете использовать дочерние / родительские типы интерфейсов в качестве обобщенных, так что, когда разработчик использует конкретные классы в БД, они могут в основном использовать ваши интерфейсы, но при этом указывайте EF использовать конкретные классы:
public interface IParent<out TChild>
where TChild : IChild
{
ICollection<TChild> Children { get; set; }
Кто-то может создать свои классы Db, например:
public class Parent : IParent<Child>
. . .
Но все равно используйте их как:
IParent<IChild> parents = db.Parents.Include(p => p.Children).ToArray();
Поскольку универсальный объект помечен out
, универсальный шаблон является ковариантным и, следовательно, может принимать все, что соответствует ограничениям универсального шаблона, включая приведенное выше приведение дерева типов к интерфейсу IChild.
Тем не менее, если вы действительно хотите сохранить интерфейсы, правильный ответ, вероятно, заключается в использовании NHibernate:
Как отобразить интерфейс в nhibernate?
И некоторые кодировщики рекомендуют хранить интерфейсы на объектах в любом ORM, ограниченные несколькими общими свойствами, или риск злоупотребления:
Программирование интерфейсов при отображении с помощью Fluent NHibernate