byłem w stanie konwertować roztwór z Janem Matousek pracować w VB.NET 2013 z Entity Framework 6. postaram się wyjaśnić jak użyć kodu w VB.NET.
Mamy bazę danych JD Edwards, która wykorzystuje różne schematy dla każdego środowiska (TESTDTA, CRPDTA, PRODDTA). Dzięki temu przełączanie między środowiskami jest uciążliwe, ponieważ musisz ręcznie zmodyfikować plik .edmx, jeśli chcesz zmienić środowisko.
Pierwszym krokiem jest utworzenie częściowej klasy, która pozwala przekazać wartość do konstruktora swoich jednostek, domyślnie używa wartości z pliku konfiguracyjnego.
Partial Public Class JDE_Entities
Public Sub New(ByVal myObjectContext As ObjectContext)
MyBase.New(myObjectContext, True)
End Sub
End Class
Następnie utwórz funkcję, która zmodyfikuje plik schematu sklepu .ssdl w pamięci.
Public Function CreateObjectContext(ByVal schema As String, ByVal connString As String, ByVal model As String) As ObjectContext
Dim myEntityConnection As EntityConnection = Nothing
Try
Dim conceptualReader As XmlReader = XmlReader.Create(Me.GetType().Assembly.GetManifestResourceStream(model + ".csdl"))
Dim mappingReader As XmlReader = XmlReader.Create(Me.GetType().Assembly.GetManifestResourceStream(model + ".msl"))
Dim storageReader As XmlReader = XmlReader.Create(Me.GetType().Assembly.GetManifestResourceStream(model + ".ssdl"))
Dim storageNS As XNamespace = "http://schemas.microsoft.com/ado/2009/11/edm/ssdl"
Dim storageXml = XDocument.Load(storageReader)
Dim conceptualXml = XDocument.Load(conceptualReader)
Dim mappingXml = XDocument.Load(mappingReader)
For Each myItem As XElement In storageXml.Descendants(storageNS + "EntitySet")
Dim schemaAttribute = myItem.Attributes("Schema").FirstOrDefault
If schemaAttribute IsNot Nothing Then
schemaAttribute.SetValue(schema)
End If
Next
storageXml.Save("storage.ssdl")
conceptualXml.Save("storage.csdl")
mappingXml.Save("storage.msl")
Dim storageCollection As StoreItemCollection = New StoreItemCollection("storage.ssdl")
Dim conceptualCollection As EdmItemCollection = New EdmItemCollection("storage.csdl")
Dim mappingCollection As StorageMappingItemCollection = New StorageMappingItemCollection(conceptualCollection, storageCollection, "storage.msl")
Dim workspace = New MetadataWorkspace()
workspace.RegisterItemCollection(conceptualCollection)
workspace.RegisterItemCollection(storageCollection)
workspace.RegisterItemCollection(mappingCollection)
Dim connectionData = New EntityConnectionStringBuilder(connString)
Dim connection = DbProviderFactories.GetFactory(connectionData.Provider).CreateConnection()
connection.ConnectionString = connectionData.ProviderConnectionString
myEntityConnection = New EntityConnection(workspace, connection)
Return New ObjectContext(myEntityConnection)
Catch ex As Exception
End Try
End Function
Upewnij się, że wartość ustalony storageNS nazw pasuje do jednego używanego w kodzie, można zobaczyć to przez debugowanie kodu i sprawdzenie zmiennej storageXML zobaczyć, co się rzeczywiście używany.
Teraz możesz przekazać nową nazwę schematu i inne informacje o połączeniu bazy danych w czasie wykonywania podczas tworzenia jednostek. Koniec z ręcznymi zmianami .edmx.
Using Context As New JDE_Entities(CreateObjectContext("NewSchemaNameHere", ConnectionString_EntityFramework("ServerName", "DatabaseName", "UserName", "Password"), "JDE_Model"))
Dim myWO = From a In Context.F4801 Where a.WADOCO = 400100
If myWO IsNot Nothing Then
For Each r In myWO
Me.Label1.Text = r.WADL01
Next
End If
End Using
Były .net bibliotek używanych:
Imports System.Data.Entity.Core.EntityClient
Imports System.Xml
Imports System.Data.Common
Imports System.Data.Entity.Core.Metadata.Edm
Imports System.Reflection
Imports System.Data.Entity.Core.Mapping
Imports System.Data.Entity.Core.Objects
Imports System.Data.Linq
Imports System.Xml.Linq
nadzieję, że pomoże ktoś tam z tymi samymi problemami.
To rozwiązanie działało idealnie dla mnie. W moim przypadku wszystko, co musiałem zrobić, to przełączać się między przedrostkami tabeli. Jednak składnia była dla mnie nieco inna: modelBuilder.Entity() .Map (x => x.ToTable (_tablePrefix + tableName)); Dzięki Serg! –
adamisnt
Miło to słyszeć! Składnia będzie się zmieniać, ponieważ mój kod został napisany i przetestowany na Entity Framework CTP4. – msa7