У меня есть проект, в котором я использовал наследование при создании первой модели данных кода. То, что все мои типы сущностей нужен общий «контекстный идентификатор», представленный в виде строки:EF/CD как переопределить атрибут индекса?
public class EBaseGenericEntity
{
:
[Index("IX_Cid", IsUnique = true)]
public virtual string Cid { get; set; }
:
}
Как вы можете видеть, свойство «Сид» всегда должен занимать уникальные значения. Дело в том: Существует один тип объекта, который это значение «Сида» не должен быть уникальным, поэтому я думал, что это будет работать:
public class EEntityInfo : EBaseGenericEntity
{
:
[Index("IX_Cid", IsUnique = false)]
public override string Cid { get; set; }
:
}
Увы, это делает Entity Framework споткнуться, жалуясь:
Свойство 'Cid' по типу 'EEntityInfo' присваивается двумя IndexAttributes с именем 'IX_Cid', которые содержат конфликтующую конфигурацию: Свойство атрибута атрибута 'IsUnique' = 'True' конфликтует с атрибутом атрибута индекса IsUnique '=' False '.
Нельзя ли переопределить атрибут свойства, подобный этому, в EF/CF?
EDIT:
Просто, чтобы убедиться, что проблема не о том, как IndexAttribute объявляется для поддержки наследования (AttributeUsage.Inherited
) Я также попытался объявить производный вариант с другим AttributeUsage:
[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
public class IndexedAttribute : IndexAttribute
{
public IndexedAttribute(string name)
: base(name)
{
}
}
И затем использовать его вместо «нормального» IndexAttribute:
public class EBaseGenericEntity
{
:
[Indexed("IX_Cid", IsUnique = true)]
public virtual string Cid { get; set; }
:
}
public class EEntityInfo : EBaseGenericEntity
{
:
[Indexed("IX_Cid", IsUnique = false)]
public override string Cid { get; set; }
:
}
Это не помогло. Мне показалось странным, что EF может найти пользовательский атрибут Indexed, несмотря на его (не наследуемое) использование. Может ли быть, что производный пользовательский атрибут также не может переопределить его AttributeUsage?
Да, я считал это, но у меня довольно много кода (включая несколько общих методов), который зависит от отношений наследования моих сущностей. Но спасибо за предложение. –
Вот почему я предложил использовать интерфейс - если вы можете заставить эти методы работать с интерфейсом, вам нужно будет только это применить к EBaseGenericEntity и EEntityInfo. Я использовал этот подход в своих проектах, когда мне нужна поддержка наследования с разными базовыми классами. – Richard
Действительно, и я буду помнить об этом для будущих проектов EF/CF, но я слишком далеко продвинулся вперед для этого решения. В конце концов мне удалось исправить его, выполнив собственный собственный db-инициализатор, который отличит пользовательский атрибут «IndexedAttribute», гарантируя, что он не наследуется для переопределенных свойств. Я по-прежнему считаю, что реализация по умолчанию (IndexAttribute) ошибочна, что не позволяет использовать переопределенное использование атрибута. –