EF4 Builder.Configurations - Невозможно определить ключ для типа объекта - PullRequest
1 голос
/ 06 сентября 2010

Интересно, может ли кто-нибудь мне помочь.

Я использую 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 Ответ

0 голосов
/ 16 сентября 2010

Мне удалось решить эту проблему, используя следующий синтаксис:

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 ()

...