Я создаю приложения с помощью C#/нетто 4,5 и EF 6 и было интересно, если я мог бы сделать следующее как-то:.Повторное использование унаследованных FK-отношений?
У меня есть две базовые классы, как:
public class BaseItem
{
[Key]
public int Id { get; set; }
public List<BaseRevision> Revisions { get; set; }
}
public class BaseRevision
{
[Key]
public int Id { get; set; }
public BaseItem Item { get; set; }
}
Теперь я получить оба им так:
[Table("ContentItems")]
public class ContentItem : BaseItem
{
public string ContentType { get; set; }
}
[Table("ContentRevisions")]
public class ContentRevision : BaseRevision
{
public string Text { get; set; }
}
Это прекрасно работает и EF даже обрабатывает запросы, как:
var revisions = db.ContentItems.Where(i => i.Revisions.Any(r => (r as ContentRevision).Text.Contians("ABC")));
Это преобразование в SQL, как и следовало ожидать, но я хотел бы «избавиться, если as
» (это вызывает гораздо большее осложнение в некоторых других случаях).
Я попытался использовать генерики BaseItem
, но это не поддерживается EF, так что я попытался следующие:
[Table("ContentItems")]
public class ContentItem : BaseItem
{
public string ContentType { get; set; }
public List<ContentRevision> ContentRevisions { get; set; }
}
[Table("ContentRevisions")]
public class ContentRevision : BaseRevision
{
public string Text { get; set; }
public ContentItem ContentItem { get; set; }
}
Так что я мог бы использовать приведенный выше запрос, как:
var revisions = db.ContentItems.Where(i => i.ContentRevisions.Any(r => r.Text.Contians("ABC")));
Но я могу 'заставить его работать, используя унаследованный внешний ключ "Item_Id" в таблице "BaseItems". EF всегда хочет создать второе FK-Relation, используя новый ключ «ContentItem_Id» в таблице «ContentItems», который будет дублировать отношение (и, возможно, вызвать некоторые другие побочные эффекты).
Возможно ли это (или у кого-то есть лучшая идея решить/улучшить эту проблему/образец)?
ОБНОВЛЕНИЕ: демонстрационный проект можно скачать HERE. Если вы добавите новую миграцию, это создаст второе FK-сопоставление, которое я не хочу ...
ARE есть таблицы для BaseItem и BaseRevision в базе данных (4 таблицы) или просто созданные ContentItem и ContentRevision (2 таблицы)? – acarlon
Извините, если это очевидный вопрос, я просто хотел убедиться, что правильно понял. Это хороший вопрос. – acarlon
@acarlon: из-за атрибута «Таблица» создано 4 таблицы, и я хочу, чтобы у меня было много классов, полученных из этой базы ... – ChrFin