2010-09-05 3 views
1

Je me demande si quelqu'un peut m'aider. J'utilise VS2010, .Net 4, EF4 et j'essaie de générer un objet objectcontext qui est entièrement configuré en code (code seulement par opposition à model-first ou db-first).EF4 Builder.Configurations - Impossible de déduire une clé pour le type d'entité

En bref, je fais:

  • Créer un ContextBuilder
  • Configurer ContextBuilder pour chaque entité (spécifiant PK, FKs, Nullable, etc.)
  • Je demande au ContextBuilder de créer un contexte moi en utilisant la chaîne de connexion fournie.

La dernière étape échoue ci-dessus à l'exception suivante:

Unable to infer a key for entity type 'MyNamespace.MyEntityName'. 

Je prends cela signifie qu'il ne peut pas en déduire une colonne clé primaire/Identité pour mon entité.

Mon code est ci-dessous. Le ContextExtension référencé est une classe wrapper qui hérite simplement de 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 

Mes entités sont définies comme suit:

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 

Et mes configurations d'entités sont comme ceci:

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 

Si j'exclus du secteur de la configuration, la même chose se produit à l'autre entité et ainsi de suite - donc soit toutes les entités/configs sont faux ou ce n'est pas un problème entité/config

Si j'examine Builder juste avant le Create() appel, je peux voir 3 configurations qui correspondent à mes entités et les id champs spécifiés sont les suivants: (Mes commentaires dans [] s)

Builder.Configurations.Items(0)[Sector].Items(0)[id].Value.StoreGeneratedPattern = Identity {1} 

qui semble impliquer que le la configuration est appliquée correctement. Est-ce que quelqu'un peut expliquer pourquoi je reçois l'exception et comment résoudre le problème?

Un grand merci

Répondre

0

j'ai pu résoudre ce problème en utilisant la syntaxe suivante:

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 

Notez l'appel

de Haskey supplémentaire()
Questions connexes