Я пытаюсь реализовать атрибут, который я могу применить к свойствам в моей первой модели данных Entity Framework кода, чтобы указать уникальные ограничения, которые будут применяться при создании базы данных. Я читал об извлечении информации сопоставления таблицы EF, используя API-интерфейс отображения, открытый для EF 6.1, и у меня прочитайте о реализации настраиваемого атрибута, чтобы указать, какие свойства представляют собой естественный ключ. Но, если я не ошибаюсь в коде, я думаю, что это будет работать только тогда, когда имя свойства CLR (OSpace/CSpace) соответствует имени столбца SQL (SSpace). Я хотел бы иметь возможность включать свойства ассоциации (внешние ключи) в свой уникальный ключ, например EnumList, в этом примере:
Public Class EnumValue
Public Property EnumValueId As Integer
Public Property Sequence As Integer
Public Overridable Property Label As TranslatedString
<MaxLength(5), MyUnique()> _
Public Property Value As String
<MyUnique()> _
Public Overridable Property EnumList As EnumList
End Class
Я начал с этого большого кода, который был основан на связанной статье о именах таблиц сопоставления
Dim ws = DirectCast(context, System.Data.Entity.Infrastructure.IObjectContextAdapter).ObjectContext.MetadataWorkspace
Dim oSpace = ws.GetItemCollection(Core.Metadata.Edm.DataSpace.OSpace)
Dim entityTypes = oSpace.GetItems(Of EntityType)()
Dim entityContainer = ws.GetItems(Of EntityContainer)(DataSpace.CSpace).Single()
Dim mapping = ws.GetItems(Of EntityContainerMapping)(DataSpace.CSSpace).Single.EntitySetMappings
For Each setType In entityTypes
Dim cSpaceEntitySet = entityContainer.EntitySets.Single(Function(t) t.ElementType.Name = setType.Name)
Dim sSpaceEntitySet = mapping.Single(Function(t) t.EntitySet Is cSpaceEntitySet)
Dim tableInfo = sSpaceEntitySet.EntityTypeMappings.Single.Fragments.Single
Dim tableName = If(tableInfo.StoreEntitySet.Table, tableInfo.StoreEntitySet.Name)
Dim schema = tableInfo.StoreEntitySet.Schema
И этого достаточно, чтобы получить необходимую информацию о имени таблицы, но теперь мне нужно каким-то образом связать имя свойства CLR с именем столбца SQL и медленно отслеживать структуру метаданных EF. Я надеюсь, что кто-то более знакомый с этим может ускорить процесс.