EF4 Builder.Configurations - Невозможно определить ключ для типа объекта
Интересно, кто-нибудь может мне помочь?
Я использую VS2010, .Net 4, EF4, и я пытаюсь сгенерировать объектный контекст, который полностью сконфигурирован в коде (только для кода, а не для модели-первого или DB-первого).
Короче я делаю:
- Создать ContextBuilder
- Настройте ContextBuilder для каждого объекта (указав PK, FK, Nullable и т. Д.)
- Я прошу ContextBuilder создать контекст для меня, используя предоставленную строку подключения.
Последний шаг выше терпит неудачу со следующим исключением:
Unable to infer a key for entity type 'MyNamespace.MyEntityName'.
Я понимаю, что это означает, что он не может вывести столбец первичного ключа / идентификатора для моей сущности.
Мой код ниже. ContextExtension
ссылка на это класс-оболочка, который просто наследует от ObjectContext
,
''Process starts with a call to this function
Private Shared Function GenerateContext() As ObjectContext
Dim ConnectionStringDetails = System.Configuration.ConfigurationManager.ConnectionStrings("MyConnectionString")
Dim Builder = New ContextBuilder(Of ContextExtension)()
ConfigureDatabase(Builder)
'' Below line throws an exception:
'' Unable to infer a key for entity type 'MyNamespace.Sector'
Dim NewContext = Builder.Create(New SqlConnection(ConnectionStringDetails.ConnectionString))
Return DirectCast(NewContext, ObjectContext)
End Function
Private Shared Sub ConfigureDatabase(ByRef Builder As ContextBuilder(Of ContextExtension))
''Apply configurations for each of my 3 entities (see code blocks below for efinitions)
ConfigureEntity(Builder, New SectorConfig)
ConfigureEntity(Builder, New SolarSystemConfig)
ConfigureEntity(Builder, New UniverseConfig)
End Sub
Private Shared Sub ConfigureEntity(Of T)(ByRef Builder As ContextBuilder(Of ContextExtension), ByVal config As EntityConfiguration(Of T))
''simple pluralization of the entity set
ConfigureEntity(Builder, config, GetType(T).Name & "s")
End Sub
Private Shared Sub ConfigureEntity(Of T)(ByRef Builder As ContextBuilder(Of ContextExtension), ByVal config As EntityConfiguration(Of T), ByVal setName As String)
''add the configuration
Builder.Configurations.Add(config)
''register the set metadata
Builder.RegisterSet(Of T)(setName)
End Sub
Мои сущности определены ниже:
Public Class Sector
Implements IEntity
Public Overridable Property id As Long Implements IEntity.id
Public Overridable Property Universe As Universe
Public Overridable Property SolarSystems As ICollection(Of SolarSystem)
End Class
И мои конфигурации сущностей таковы:
Public Class SectorConfig
Inherits EntityConfiguration(Of Sector)
Public Sub New()
[Property](Function(x) x.id).IsIdentity()
Relationship(Function(x) x.Universe).FromProperty(Function(y) y.Sectors).IsRequired()
End Sub
End Class
Если я исключаю сектор из конфига, то же самое происходит со следующей сущностью и так далее - так что либо все сущности / конфиги неверны, либо это не проблема сущности / конфига
Если я исследую Builder
как раз перед Create()
вызов, я вижу 3 конфигурации, которые соответствуют моим сущностям и id
указанные поля имеют следующее: (Мои комментарии в []s)
Builder.Configurations.Items(0)[Sector].Items(0)[id].Value.StoreGeneratedPattern = Identity {1}
Что, по-видимому, подразумевает, что конфигурация применяется правильно.
Может кто-нибудь объяснить, почему я получаю исключение и как решить проблему?
Большое спасибо
1 ответ
Мне удалось решить эту проблему с помощью следующего синтаксиса:
Public Class SectorConfig
Inherits EntityConfiguration(Of Sector)
Public Sub New()
HasKey(Function(x) X.id)
[Property](Function(x) x.id).IsIdentity()
Relationship(Function(x) x.Universe).FromProperty(Function(y) y.Sectors).IsRequired()
End Sub
End Class
Обратите внимание на дополнительный вызов HasKey()