Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何获取实体复杂属性的表列名?(VB 2010/EF4)_Vb.net_Visual Studio 2010_Entity Framework 4 - Fatal编程技术网

Vb.net 如何获取实体复杂属性的表列名?(VB 2010/EF4)

Vb.net 如何获取实体复杂属性的表列名?(VB 2010/EF4),vb.net,visual-studio-2010,entity-framework-4,Vb.net,Visual Studio 2010,Entity Framework 4,我编写了以下代码(VB 2010/EF 4),用于从(概念)实体/属性名称获取存储(数据库)表/列名: Imports System.Data.Objects Imports System.Data.Entity Imports System.Data.SqlClient Imports System.Data.EntityClient Imports System.Data.Metadata.Edm Imports System.Data.Objects.DataClasses Imports

我编写了以下代码(VB 2010/EF 4),用于从(概念)实体/属性名称获取存储(数据库)表/列名:

Imports System.Data.Objects
Imports System.Data.Entity
Imports System.Data.SqlClient
Imports System.Data.EntityClient
Imports System.Data.Metadata.Edm
Imports System.Data.Objects.DataClasses
Imports System.Linq.Expressions
Imports System.Runtime.Serialization
Imports System.Reflection

Public Class ConvertConceptualToStore
    Private Shared Function GetTableName(Of T As EntityObject)() As String
    Dim type As Type = GetType(T) : Dim at = GetAttribute(Of EdmEntityTypeAttribute)(type)
    Return at.Name
    End Function

    Private Shared Function GetColumnName(Of T As EntityObject) _
        (ByVal propertySelector As Expression(Of Func(Of T, Object))) As String

    If propertySelector Is Nothing Then
        Throw New Exception("""" & propertySelector.ToString & """ is null.")
    End If

    Dim propertyInfo As PropertyInfo = GetPropertyInfo(propertySelector.Body)
    Dim attribute As DataMemberAttribute = _
        GetAttribute(Of DataMemberAttribute)(propertyInfo)
    If String.IsNullOrEmpty(attribute.Name) Then
        Return propertyInfo.Name
    Else
        Return attribute.Name
    End If
    End Function

    Private Shared Function GetAttribute(Of T As Class) (ByVal memberInfo As MemberInfo) As T
    If memberInfo Is Nothing Then
        Throw New Exception("""" & memberInfo.ToString & """ is null.")
    End If

    Dim customAttributes() As Object = _
        memberInfo.GetCustomAttributes(GetType(T), False)
    Dim attribute As T = _
        DirectCast(customAttributes.Where(Function(a) TypeOf a Is T).First(), T)
    Return attribute
    End Function

    Private Shared Function GetPropertyInfo(ByVal propertySelector As Expression) As PropertyInfo
    If propertySelector Is Nothing Then
        Throw New Exception("""" & propertySelector.ToString & """ is null.")
    End If

    Dim memberExpression As MemberExpression = _
        TryCast(propertySelector, MemberExpression)
    If memberExpression Is Nothing Then
        Dim unaryExpression As UnaryExpression = _
            TryCast(propertySelector, UnaryExpression)
        If unaryExpression IsNot Nothing _
                AndAlso unaryExpression.NodeType = ExpressionType.Convert Then
            memberExpression = TryCast(unaryExpression.Operand, MemberExpression)
        End If
    End If
    If memberExpression IsNot Nothing _
            AndAlso memberExpression.Member.MemberType = MemberTypes.Property Then
        Return DirectCast(memberExpression.Member, PropertyInfo)
    Else
        Throw New ArgumentException("No property reference was found.", "propertySelector")
    End If
    End Function

    ' Invocation example
    'Public Shared Function Test()
    'Dim table As String = GetTableName(Of User)()
    'Dim column As String = GetColumnName(Of User)(Function(u) u.Name)
    'End Function
End Class
问题:

  • 我假设代码不需要ObjectContext或 数据空间
  • 如果列是复杂属性的组件,该怎么办?应该做些什么吗 那就不一样了?(即,如果位置是一个具有复杂属性的实体,名为 Address,那么如何获得Address.Street的列名呢?)
  • 这是一个用于在概念信息和存储信息之间转换的通用算法,用Visual Basic 2010编写。

    我编写了一个新例程,用于将实体/属性对转换为表/列对。此类MSLMappingAction在其构造函数中接受模型名和XElement XML树、MSL映射文件或XML字符串。然后使用ConceptualToStore方法获取指定实体和属性“表达式”(存储在MSLConceptualInfo结构中)的字符串,并查找表名和列名(存储在MSLStoreInfo结构中)

    注意事项:

    Option Infer On
    Imports System.Xml.Linq
    
    ''' <summary>
    ''' This class allows one to convert between an EF conceptual model's entity/property pair
    ''' and its database store's table/column pair.
    ''' </summary>
    ''' <remarks>It takes into account entity splitting and complex-property designations;
    ''' it DOES NOT take into account inherited properties
    ''' (in such a case, you should access the entity's base class)</remarks>
    Public Class MSLMappingAction
    
    '   private fields and routines
    Private mmaMSLMapping As XElement
    Private mmaModelName, mmaNamespace As String
    
    Private Function FullElementName(ByVal ElementName As String) As String
    '   pre-pend Namespace to ElementName
    Return "{" & mmaNamespace & "}" & ElementName
    End Function
    
    Private Sub ValidateParams(ByVal MappingXML As XElement, Byval ModelName As String)
    '   verify that model name is specified
    If String.IsNullOrEmpty(ModelName) Then
        Throw New EntityException("Entity model name is not given!")
    End If
    '   verify that we're using C-S space
    If MappingXML.@Space <> "C-S" Then
        Throw New MetadataException("XML is not C-S mapping data!")
    End If
    '   get Namespace and set private variables
    mmaNamespace = MappingXML.@xmlns
    mmaMSLMapping = MappingXML : mmaModelName = ModelName
    End Sub
    
    Private Function IsSequenceEmpty(Items As IEnumerable(Of XElement)) As Boolean
    '   determine if query result is empty
    Return _
        Items Is Nothing OrElse Items.Count = 0
    End Function
    
    '   properties
    ''' <summary>
    ''' Name of conceptual entity model
    ''' </summary>
    ''' <returns>Conceptual-model String</returns>
    ''' <remarks>Model name can only be set in constructor</remarks>
    Public ReadOnly Property EntityModelName() As String
    Get
        Return mmaModelName
    End Get
    End Property
    
    ''' <summary>
    ''' Name of mapping namespace
    ''' </summary>
    ''' <returns>Namespace String of C-S mapping layer</returns>
    ''' <remarks>This value is determined when the XML mapping
    ''' is first parsed in the constructor</remarks>
    Public ReadOnly Property MappingNamespace() As String
    Get
        Return mmaNamespace
    End Get
    End Property
    
    '   constructors
    ''' <summary>
    ''' Get C-S mapping information for an entity model (with XML tree)
    ''' </summary>
    ''' <param name="MappingXML">XML mapping tree</param>
    ''' <param name="ModelName">Conceptual-model name</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal MappingXML As XElement, ByVal ModelName As String)
    ValidateParams(MappingXML, ModelName)
    End Sub
    
    ''' <summary>
    ''' Get C-S mapping information for an entity model (with XML file)
    ''' </summary>
    ''' <param name="MSLFile">MSL mapping file</param>
    ''' <param name="ModelName">Conceptual-model name</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal MSLFile As String, ByVal ModelName As String)
    Dim MappingXML As XElement = XElement.Load(MSLFile)
    ValidateParams(MappingXML, ModelName)
    End Sub
    
    '   methods
    ''' <summary>
    ''' Get C-S mapping infomration for an entity model (with XML String)
    ''' </summary>
    ''' <param name="XMLString">XML mapping String</param>
    ''' <param name="ModelName">Conceptual-model name</param>
    ''' <returns></returns>
    Public Shared Function Parse(ByVal XMLString As String, ByVal ModelName As String)
    Return New MSLMappingAction(XElement.Parse(XMLString), ModelName)
    End Function
    
    ''' <summary>
    ''' Convert conceptual entity/property information into store table/column information
    ''' </summary>
    ''' <param name="ConceptualInfo">Conceptual-model data
    ''' (.EntityName = entity expression String, .PropertyName = property expression String)</param>
    ''' <returns>Store data (.TableName = table-name String, .ColumnName = column-name String)</returns>
    ''' <remarks></remarks>
    Public Function ConceptualToStore(ByVal ConceptualInfo As MSLConceptualInfo) As MSLStoreInfo
    Dim StoreInfo As New MSLStoreInfo
    With ConceptualInfo
        '   prepare to query XML
        If Not .EntityName.Contains(".") Then
            '   make sure entity name is fully qualified
            .EntityName = mmaModelName & "." & .EntityName
        End If
        '   separate property names if there's complex-type nesting
        Dim Properties() As String = .PropertyName.Split(".")
        '   get relevant entity mapping
        Dim MappingInfo As IEnumerable(Of XElement) = _                 
            (From mi In mmaMSLMapping.Descendants(FullElementName("EntityTypeMapping")) _
                Where mi.@TypeName = "IsTypeOf(" & .EntityName & ")" _
                    OrElse mi.@TypeName = .EntityName _
             Select mi)
        '   make sure entity is in model
        If IsSequenceEmpty(MappingInfo) Then
            Throw New EntityException("Entity """ & .EntityName & """ was not found!")
        End If
        '   get mapping fragments
        Dim MappingFragments As IEnumerable(Of XElement) = _
            (From mf In MappingInfo.Descendants(FullElementName("MappingFragment")) _
             Select mf)
        '   make sure there's at least 1 fragment
        If IsSequenceEmpty(MappingFragments) Then
            Throw New EntityException("Entity """ & .EntityName & """ was not mapped!")
        End If
        '   search each mapping fragment for the desired property
        For Each MappingFragment In MappingFragments
            '   get physical table for this fragment
            StoreInfo.TableName = MappingFragment.@StoreEntitySet
            '   search property expression chain
            Dim PropertyMapping As IEnumerable(Of XElement) = {MappingFragment}
            '   parse complex property info (if any)
            For index = 0 To UBound(Properties) - 1
                '   go down 1 level
                Dim ComplexPropertyName = Properties(index)
                PropertyMapping = _
                    (From pm In PropertyMapping.Elements(FullElementName("ComplexProperty")) _
                        Where pm.@Name = ComplexPropertyName)
                '   verify that the property specified for this level exists
                If IsSequenceEmpty(PropertyMapping) Then
                    Exit For 'go to next fragment if not
                End If
            Next index
            '   property not found? try next fragment
            If IsSequenceEmpty(PropertyMapping) Then
                Continue For
            End If
            '   parse scalar property info
            Dim ScalarPropertyName = Properties(UBound(Properties))
            Dim ColumnName As String = _
                (From pm In PropertyMapping.Elements(FullElementName("ScalarProperty")) _
                    Where pm.@Name = ScalarPropertyName _
                    Select CN = pm.@ColumnName).FirstOrDefault
            '   verify that scalar property exists
            If Not String.IsNullOrEmpty(ColumnName) Then
                '   yes? return (exit) with column info
                StoreInfo.ColumnName = ColumnName : Return StoreInfo
            End If
        Next MappingFragment
        '   property wasn't found
        Throw New EntityException("Property """ & .PropertyName _
            & """ of entity """ & .EntityName & """ was not found!")
    End With
    End Function
    End Class
    
    ''' <summary>
    ''' Conceptual-model entity and property information  
    ''' </summary>
    Public Structure MSLConceptualInfo
    ''' <summary>
    ''' Name of entity in conceptual model
    ''' </summary>
    ''' <value>Entity expression String</value>
    ''' <remarks>EntityName may or may not be fully qualified (i.e., "ModelName.EntityName");
    ''' when a mapping method is called by the MSLMappingAction class, the conceptual model's
    ''' name and a period will be pre-pended if it's omitted</remarks>
    Public Property EntityName As String
    ''' <summary>
    ''' Name of property in entity
    ''' </summary>
    ''' <value>Property expression String</value>
    ''' <remarks>PropertyName may be either a stand-alone scalar property or a scalar property
    ''' within 1 or more levels of complex-type properties; in the latter case, it MUST be fully
    ''' qualified (i.e., "ComplexPropertyName.InnerComplexPropertyName.ScalarPropertyName")</remarks>
    Public Property PropertyName As String
    End Structure
    
    ''' <summary>
    ''' Database-store table and column information
    ''' </summary>
    Public Structure MSLStoreInfo
    ''' <summary>
    ''' Name of table in database
    ''' </summary>
    Public Property TableName As String
    ''' <summary>
    ''' Name of column in database table
    ''' </summary>
    Public Property ColumnName As String
    End Structure
    
  • 还可以编写一个“storetoconcept”方法进行转换 另一个方向,但XML查询可能有点复杂 更复杂。这同样适用于处理 导航属性/函数/存储过程映射
  • 注意派生实体的继承属性!如果一个属性是 不特定于派生实体,则应使用基 实体的名称。)
  • 这是密码

    主机代码:(对于给定的XML示例[参见底部],当给定实体“Location”和属性表达式“Address.Street”[和概念模型名称“SCTModel”]时,它返回存储信息的表名“Locations”和列名“Address_Street”):

    类别代码:

    Option Infer On
    Imports System.Xml.Linq
    
    ''' <summary>
    ''' This class allows one to convert between an EF conceptual model's entity/property pair
    ''' and its database store's table/column pair.
    ''' </summary>
    ''' <remarks>It takes into account entity splitting and complex-property designations;
    ''' it DOES NOT take into account inherited properties
    ''' (in such a case, you should access the entity's base class)</remarks>
    Public Class MSLMappingAction
    
    '   private fields and routines
    Private mmaMSLMapping As XElement
    Private mmaModelName, mmaNamespace As String
    
    Private Function FullElementName(ByVal ElementName As String) As String
    '   pre-pend Namespace to ElementName
    Return "{" & mmaNamespace & "}" & ElementName
    End Function
    
    Private Sub ValidateParams(ByVal MappingXML As XElement, Byval ModelName As String)
    '   verify that model name is specified
    If String.IsNullOrEmpty(ModelName) Then
        Throw New EntityException("Entity model name is not given!")
    End If
    '   verify that we're using C-S space
    If MappingXML.@Space <> "C-S" Then
        Throw New MetadataException("XML is not C-S mapping data!")
    End If
    '   get Namespace and set private variables
    mmaNamespace = MappingXML.@xmlns
    mmaMSLMapping = MappingXML : mmaModelName = ModelName
    End Sub
    
    Private Function IsSequenceEmpty(Items As IEnumerable(Of XElement)) As Boolean
    '   determine if query result is empty
    Return _
        Items Is Nothing OrElse Items.Count = 0
    End Function
    
    '   properties
    ''' <summary>
    ''' Name of conceptual entity model
    ''' </summary>
    ''' <returns>Conceptual-model String</returns>
    ''' <remarks>Model name can only be set in constructor</remarks>
    Public ReadOnly Property EntityModelName() As String
    Get
        Return mmaModelName
    End Get
    End Property
    
    ''' <summary>
    ''' Name of mapping namespace
    ''' </summary>
    ''' <returns>Namespace String of C-S mapping layer</returns>
    ''' <remarks>This value is determined when the XML mapping
    ''' is first parsed in the constructor</remarks>
    Public ReadOnly Property MappingNamespace() As String
    Get
        Return mmaNamespace
    End Get
    End Property
    
    '   constructors
    ''' <summary>
    ''' Get C-S mapping information for an entity model (with XML tree)
    ''' </summary>
    ''' <param name="MappingXML">XML mapping tree</param>
    ''' <param name="ModelName">Conceptual-model name</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal MappingXML As XElement, ByVal ModelName As String)
    ValidateParams(MappingXML, ModelName)
    End Sub
    
    ''' <summary>
    ''' Get C-S mapping information for an entity model (with XML file)
    ''' </summary>
    ''' <param name="MSLFile">MSL mapping file</param>
    ''' <param name="ModelName">Conceptual-model name</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal MSLFile As String, ByVal ModelName As String)
    Dim MappingXML As XElement = XElement.Load(MSLFile)
    ValidateParams(MappingXML, ModelName)
    End Sub
    
    '   methods
    ''' <summary>
    ''' Get C-S mapping infomration for an entity model (with XML String)
    ''' </summary>
    ''' <param name="XMLString">XML mapping String</param>
    ''' <param name="ModelName">Conceptual-model name</param>
    ''' <returns></returns>
    Public Shared Function Parse(ByVal XMLString As String, ByVal ModelName As String)
    Return New MSLMappingAction(XElement.Parse(XMLString), ModelName)
    End Function
    
    ''' <summary>
    ''' Convert conceptual entity/property information into store table/column information
    ''' </summary>
    ''' <param name="ConceptualInfo">Conceptual-model data
    ''' (.EntityName = entity expression String, .PropertyName = property expression String)</param>
    ''' <returns>Store data (.TableName = table-name String, .ColumnName = column-name String)</returns>
    ''' <remarks></remarks>
    Public Function ConceptualToStore(ByVal ConceptualInfo As MSLConceptualInfo) As MSLStoreInfo
    Dim StoreInfo As New MSLStoreInfo
    With ConceptualInfo
        '   prepare to query XML
        If Not .EntityName.Contains(".") Then
            '   make sure entity name is fully qualified
            .EntityName = mmaModelName & "." & .EntityName
        End If
        '   separate property names if there's complex-type nesting
        Dim Properties() As String = .PropertyName.Split(".")
        '   get relevant entity mapping
        Dim MappingInfo As IEnumerable(Of XElement) = _                 
            (From mi In mmaMSLMapping.Descendants(FullElementName("EntityTypeMapping")) _
                Where mi.@TypeName = "IsTypeOf(" & .EntityName & ")" _
                    OrElse mi.@TypeName = .EntityName _
             Select mi)
        '   make sure entity is in model
        If IsSequenceEmpty(MappingInfo) Then
            Throw New EntityException("Entity """ & .EntityName & """ was not found!")
        End If
        '   get mapping fragments
        Dim MappingFragments As IEnumerable(Of XElement) = _
            (From mf In MappingInfo.Descendants(FullElementName("MappingFragment")) _
             Select mf)
        '   make sure there's at least 1 fragment
        If IsSequenceEmpty(MappingFragments) Then
            Throw New EntityException("Entity """ & .EntityName & """ was not mapped!")
        End If
        '   search each mapping fragment for the desired property
        For Each MappingFragment In MappingFragments
            '   get physical table for this fragment
            StoreInfo.TableName = MappingFragment.@StoreEntitySet
            '   search property expression chain
            Dim PropertyMapping As IEnumerable(Of XElement) = {MappingFragment}
            '   parse complex property info (if any)
            For index = 0 To UBound(Properties) - 1
                '   go down 1 level
                Dim ComplexPropertyName = Properties(index)
                PropertyMapping = _
                    (From pm In PropertyMapping.Elements(FullElementName("ComplexProperty")) _
                        Where pm.@Name = ComplexPropertyName)
                '   verify that the property specified for this level exists
                If IsSequenceEmpty(PropertyMapping) Then
                    Exit For 'go to next fragment if not
                End If
            Next index
            '   property not found? try next fragment
            If IsSequenceEmpty(PropertyMapping) Then
                Continue For
            End If
            '   parse scalar property info
            Dim ScalarPropertyName = Properties(UBound(Properties))
            Dim ColumnName As String = _
                (From pm In PropertyMapping.Elements(FullElementName("ScalarProperty")) _
                    Where pm.@Name = ScalarPropertyName _
                    Select CN = pm.@ColumnName).FirstOrDefault
            '   verify that scalar property exists
            If Not String.IsNullOrEmpty(ColumnName) Then
                '   yes? return (exit) with column info
                StoreInfo.ColumnName = ColumnName : Return StoreInfo
            End If
        Next MappingFragment
        '   property wasn't found
        Throw New EntityException("Property """ & .PropertyName _
            & """ of entity """ & .EntityName & """ was not found!")
    End With
    End Function
    End Class
    
    ''' <summary>
    ''' Conceptual-model entity and property information  
    ''' </summary>
    Public Structure MSLConceptualInfo
    ''' <summary>
    ''' Name of entity in conceptual model
    ''' </summary>
    ''' <value>Entity expression String</value>
    ''' <remarks>EntityName may or may not be fully qualified (i.e., "ModelName.EntityName");
    ''' when a mapping method is called by the MSLMappingAction class, the conceptual model's
    ''' name and a period will be pre-pended if it's omitted</remarks>
    Public Property EntityName As String
    ''' <summary>
    ''' Name of property in entity
    ''' </summary>
    ''' <value>Property expression String</value>
    ''' <remarks>PropertyName may be either a stand-alone scalar property or a scalar property
    ''' within 1 or more levels of complex-type properties; in the latter case, it MUST be fully
    ''' qualified (i.e., "ComplexPropertyName.InnerComplexPropertyName.ScalarPropertyName")</remarks>
    Public Property PropertyName As String
    End Structure
    
    ''' <summary>
    ''' Database-store table and column information
    ''' </summary>
    Public Structure MSLStoreInfo
    ''' <summary>
    ''' Name of table in database
    ''' </summary>
    Public Property TableName As String
    ''' <summary>
    ''' Name of column in database table
    ''' </summary>
    Public Property ColumnName As String
    End Structure
    
    选项推断打开
    导入System.Xml.Linq
    ''' 
    ''此类允许在EF概念模型的实体/属性对之间进行转换
    ''及其数据库存储的表/列对。
    ''' 
    “它考虑了实体分割和复杂的财产指定;
    ''它不考虑继承的属性
    ''(在这种情况下,您应该访问实体的基类)
    公共类MSLMappingAction
    “私有字段和例程
    私有mmaMSLMapping As XElement
    私有mmaModelName,mmaNamespace为字符串
    私有函数FullElementName(ByVal ElementName作为字符串)作为字符串
    '将命名空间预挂起到ElementName
    返回“{”&mmaNamespace&“}”&ElementName
    端函数
    私有子ValidateParams(ByVal MappingXML作为XElement,ByVal ModelName作为字符串)
    '验证是否指定了模型名称
    如果String.IsNullOrEmpty(ModelName),则
    抛出新EntityException(“未给出实体模型名称!”)
    如果结束
    '验证我们正在使用C-S空间
    如果映射XML。@空格为“C-S”,则
    抛出新的MetadataException(“XML不是C-S映射数据!”)
    如果结束
    '获取命名空间并设置私有变量
    mmaNamespace=MappingXML@xmlns
    mmaMSLMapping=MappingXML:mmaModelName=ModelName
    端接头
    私有函数IsSequenceEmpty(项作为IEnumerable(属于XElement))作为布尔值
    '确定查询结果是否为空
    返回_
    Items为Nothing或Else Items。计数=0
    端函数
    "性质",
    ''' 
    “概念实体模型的名称”
    ''' 
    ''概念模型字符串
    只能在构造函数中设置“”模型名称
    作为字符串的公共只读属性EntityModelName()
    得到
    返回模型名
    结束
    端属性
    ''' 
    映射命名空间的“”名称
    ''' 
    C-S映射层的“”命名空间字符串
    ''此值是在XML映射
    “”首先在构造函数中解析
    作为字符串的公共只读属性MappingNamespace()
    得到
    返回名称空间
    结束
    端属性
    “构造器
    ''' 
    ''获取实体模型的C-S映射信息(使用XML树)
    ''' 
    ''XML映射树
    ''概念模型名称
    ''' 
    Public-Sub-New(ByVal-MappingXML作为元素,ByVal-ModelName作为字符串)
    ValidateParams(映射XML、模型名)
    端接头
    ''' 
    ''获取实体模型的C-S映射信息(使用XML文件)
    ''' 
    ''MSL映射文件
    ''概念模型名称
    ''' 
    Public Sub New(ByVal MSLFile作为字符串,ByVal ModelName作为字符串)
    尺寸映射XML为XElement=XElement.Load(MSLFile)
    ValidateParams(映射XML、模型名)
    端接头
    "方法",
    ''' 
    ''获取实体模型的C-S映射信息(使用XML字符串)
    ''' 
    ''XML映射字符串
    ''概念模型名称
    ''' 
    公共共享函数解析(ByVal XMLString作为字符串,ByVal ModelName作为字符串)
    返回新的MSLMappingAction(XElement.Parse(XMLString),ModelName)
    端函数
    ''' 
    ''将概念实体/属性信息转换为存储表/列信息
    ''' 
    ''概念模型数据
    “”(.EntityName=实体表达式字符串,.PropertyName=属性表达式字符串)
    ''存储数据(.TableName=表名字符串,.ColumnName=列名字符串)
    ''' 
    公共函数ConceptualToStore(ByVal ConceptualInfo作为MSLConceptualInfo)作为MSLStoreInfo
    将StoreInfo设置为新的MSLStoreInfo
    使用概念信息
    '准备查询XML
    如果不是。EntityName.Contains(“.”),则
    '确保实体名称是完全限定的
    .EntityName=mmaModelName&“&.EntityName
    如果结束
    '如果存在复杂的类型嵌套,请使用单独的属性名称
    Dim Properties()作为字符串=.PropertyName.Split(“.”)
    '获取相关实体映射
    Dim MappingInfo作为IEnumerable(像素的)=\u
    (来自mmaMSLMapping.subjects(FullElementName(“EntityTypeMapping”))中的mi)_
    其中mi.@TypeName=“IsTypeOf(&.EntityName&)”_
    OrElse mi。@TypeName=.EntityName_
    选择mi)
    '确保实体在模型中
    如果IsSequenceEmpty(映射信息),则
    抛出新的EntityException(“实体”&。EntityName&”不是
    
    <?xml version="1.0" encoding="utf-8"?>
    <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs">
      <EntityContainerMapping StorageEntityContainer="SCTModelStoreContainer" CdmEntityContainer="SocialContactsTracker">
        <EntitySetMapping Name="SocialContacts">
          <EntityTypeMapping TypeName="IsTypeOf(SCTModel.SocialContact)">
            <MappingFragment StoreEntitySet="SocialContacts">
              <ScalarProperty Name="Id" ColumnName="Id" />
              <ScalarProperty Name="DateAdded" ColumnName="DateAdded" />
              <ScalarProperty Name="Information" ColumnName="Information" />
              <ComplexProperty Name="DefaultAssociations" TypeName="SCTModel.DefaultAssociations">
                <ScalarProperty Name="DefaultLocationID" ColumnName="DefaultAssociations_DefaultLocationID" />
                <ScalarProperty Name="DefaultEmailID" ColumnName="DefaultAssociations_DefaultEmailID" />
                <ScalarProperty Name="DefaultPhoneNumberID" ColumnName="DefaultAssociations_DefaultPhoneNumberID" />
                <ScalarProperty Name="DefaultWebsiteID" ColumnName="DefaultAssociations_DefaultWebsiteID" />
              </ComplexProperty>
              <ScalarProperty Name="Picture" ColumnName="Picture" />
            </MappingFragment>
          </EntityTypeMapping>
          <EntityTypeMapping TypeName="IsTypeOf(SCTModel.Person)">
            <MappingFragment StoreEntitySet="SocialContacts_Person">
              <ScalarProperty Name="Id" ColumnName="Id" />
              <ScalarProperty Name="DateOfBirth" ColumnName="DateOfBirth" />
              <ScalarProperty Name="FirstName" ColumnName="FirstName" />
              <ScalarProperty Name="LastName" ColumnName="LastName" />
            </MappingFragment>
          </EntityTypeMapping>
          <EntityTypeMapping TypeName="IsTypeOf(SCTModel.Organization)">
            <MappingFragment StoreEntitySet="SocialContacts_Organization">
              <ScalarProperty Name="Id" ColumnName="Id" />
              <ScalarProperty Name="Name" ColumnName="Name" />
              <ScalarProperty Name="DateOfCreation" ColumnName="DateOfCreation" />
            </MappingFragment>
          </EntityTypeMapping>
        </EntitySetMapping>
        <EntitySetMapping Name="Locations">
          <EntityTypeMapping TypeName="IsTypeOf(SCTModel.Location)">
            <MappingFragment StoreEntitySet="Locations">
              <ScalarProperty Name="Id" ColumnName="Id" />
              <ScalarProperty Name="City" ColumnName="City" />
              <ScalarProperty Name="State" ColumnName="State" />
              <ScalarProperty Name="ZIP" ColumnName="ZIP" />
              <ScalarProperty Name="Country" ColumnName="Country" />
              <ComplexProperty Name="Address" TypeName="SCTModel.Address">
                <ScalarProperty Name="Street" ColumnName="Address_Street" />
                <ScalarProperty Name="Apartment" ColumnName="Address_Apartment" />
                <ScalarProperty Name="HouseNumber" ColumnName="Address_HouseNumber" />
              </ComplexProperty>
            </MappingFragment>
          </EntityTypeMapping>
        </EntitySetMapping>
        <EntitySetMapping Name="PhoneNumbers">
          <EntityTypeMapping TypeName="IsTypeOf(SCTModel.PhoneNumber)">
            <MappingFragment StoreEntitySet="PhoneNumbers">
              <ScalarProperty Name="Id" ColumnName="Id" />
              <ScalarProperty Name="Number" ColumnName="Number" />
              <ScalarProperty Name="PhoneType" ColumnName="PhoneType" />
            </MappingFragment>
          </EntityTypeMapping>
        </EntitySetMapping>
        <EntitySetMapping Name="Emails">
          <EntityTypeMapping TypeName="IsTypeOf(SCTModel.Email)">
            <MappingFragment StoreEntitySet="Emails">
              <ScalarProperty Name="Id" ColumnName="Id" />
              <ScalarProperty Name="DomainName" ColumnName="DomainName" />
              <ScalarProperty Name="UserName" ColumnName="UserName" />
            </MappingFragment>
          </EntityTypeMapping>
        </EntitySetMapping>
        <EntitySetMapping Name="Websites">
          <EntityTypeMapping TypeName="IsTypeOf(SCTModel.Website)">
            <MappingFragment StoreEntitySet="Websites">
              <ScalarProperty Name="Id" ColumnName="Id" />
              <ScalarProperty Name="URL" ColumnName="URL" />
            </MappingFragment>
          </EntityTypeMapping>
        </EntitySetMapping>
        <AssociationSetMapping Name="SocialContactWebsite" TypeName="SCTModel.SocialContactWebsite" StoreEntitySet="SocialContactWebsite">
          <EndProperty Name="SocialContact">
            <ScalarProperty Name="Id" ColumnName="SocialContacts_Id" />
          </EndProperty>
          <EndProperty Name="Website">
            <ScalarProperty Name="Id" ColumnName="Websites_Id" />
          </EndProperty>
        </AssociationSetMapping>
        <AssociationSetMapping Name="SocialContactPhoneNumber" TypeName="SCTModel.SocialContactPhoneNumber" StoreEntitySet="SocialContactPhoneNumber">
          <EndProperty Name="SocialContact">
            <ScalarProperty Name="Id" ColumnName="SocialContacts_Id" />
          </EndProperty>
          <EndProperty Name="PhoneNumber">
            <ScalarProperty Name="Id" ColumnName="PhoneNumbers_Id" />
          </EndProperty>
        </AssociationSetMapping>
        <AssociationSetMapping Name="SocialContactEmail" TypeName="SCTModel.SocialContactEmail" StoreEntitySet="SocialContactEmail">
          <EndProperty Name="SocialContact">
            <ScalarProperty Name="Id" ColumnName="SocialContacts_Id" />
          </EndProperty>
          <EndProperty Name="Email">
            <ScalarProperty Name="Id" ColumnName="Emails_Id" />
          </EndProperty>
        </AssociationSetMapping>
        <AssociationSetMapping Name="SocialContactLocation" TypeName="SCTModel.SocialContactLocation" StoreEntitySet="SocialContactLocation">
          <EndProperty Name="SocialContact">
            <ScalarProperty Name="Id" ColumnName="SocialContacts_Id" />
          </EndProperty>
          <EndProperty Name="Location">
            <ScalarProperty Name="Id" ColumnName="Locations_Id" />
          </EndProperty>
        </AssociationSetMapping>
      </EntityContainerMapping>
    </Mapping>