Nhibernate 实体框架嵌套数据库类

Nhibernate 实体框架嵌套数据库类,nhibernate,entity-framework-5,castle-activerecord,Nhibernate,Entity Framework 5,Castle Activerecord,类定义 Public Class AddressEntity Private _addressId As Guid Private m_strStreet As String Private m_strSuite As String Private m_strCity As String Private m_State As String Private m_strZipCode As String Private m_strCountry

类定义

Public Class AddressEntity
    Private _addressId As Guid
    Private m_strStreet As String
    Private m_strSuite As String
    Private m_strCity As String
    Private m_State As String
    Private m_strZipCode As String
    Private m_strCountry As String

    Public Overridable Property Street() As String
        Get
            Return m_strStreet
        End Get
        Set(ByVal Value As String)
            m_strStreet = Left(Value, 50)
            DataChanged(EntityState.Modified, "Street")
        End Set
    End Property

    Public Overridable Property Suite() As String
        Get
            Return m_strSuite
        End Get
        Set(ByVal Value As String)
            m_strSuite = Left(Value, 50)
            DataChanged(EntityState.Modified, "Suite")
        End Set
    End Property

    Public Overridable Property City() As String
        Get
            Return m_strCity
        End Get
        Set(ByVal Value As String)
            m_strCity = Left(Value, 50)
            DataChanged(EntityState.Modified, "City")
        End Set
    End Property

    Public Overridable Property State() As String
        Get
            Return m_State
        End Get
        Set(ByVal Value As String)
            m_State = Left(Value, 50)
            DataChanged(EntityState.Modified, "State")
        End Set
    End Property

    <MaxStringLength(10)>
    Public Overridable Property ZipCode() As String
        Get
            Return m_strZipCode
        End Get
        Set(ByVal Value As String)
            m_strZipCode = Left(Value, 10)
            DataChanged(EntityState.Modified, "ZipCode")
        End Set
    End Property

    Public Overridable Property Country() As String
        Get
            Return m_strCountry
        End Get
        Set(ByVal Value As String)
            m_strCountry = Left(Value, 50)
            DataChanged(EntityState.Modified, "Country")
        End Set
    End Property

    <Key>
    Public Overridable Property AddressId() As Guid
        Get
            Return _addressId
        End Get
        Set(ByVal value As Guid)
            _addressId = value
        End Set
    End Property


Public Class AMAStatementEntity
    Private _DateOfService As Nullable(Of DateTime)
    Private _FacilityLocation As AddressEntity
    Private _BillingAddress As AddressEntity

    <Key>
    Public Property AMAId() As Guid
        Get
            Return _amaId
        End Get
        Set(ByVal value As Guid)
            _amaId = value
        End Set
    End Property
    Public Property DateOfService() As Nullable(Of Date)
        Get
            Return _DateOfService
        End Get
        Set(ByVal value As Nullable(Of Date))
            _DateOfService = value
        End Set
    End Property


    'This was used in Castle Activerecord
    '<Nested(ColumnPrefix:="FL")> _
    Public Property FacilityLocation() As AddressEntity
        Get
            Return _FacilityLocation
        End Get
        Set(ByVal value As AddressEntity)
            _FacilityLocation = value
        End Set
    End Property

    'This was used in Castle Activerecord
    '<Nested(ColumnPrefix:="BA")> _
    Public Property BillingAddress() As AddressEntity
        Get
            Return _BillingAddress
        End Get
        Set(ByVal value As AddressEntity)
            _BillingAddress = value
        End Set
    End Property

    'Other irrelevant properties cut for brevity.

End Class

鉴于上述类和表结构,我可以,如果可以,我如何正确地告诉EntityFramework这些类是如何存储在数据库中的?我正在从CastleActiveRecord(位于NHibernate顶部)迁移,它使用了一个嵌套属性,带有选项列前缀。另外,我不知道这个构造的正确名称是什么(如果有),我知道TPT、TPC和TPH,但我还没有找到它的名称。

对于实体框架,您所谓的“嵌套数据库类”的终端技术是

在EF术语中,它不是一个“实体”(它有自己的标识,在大多数情况下有自己的数据库表),因此名称
AddressEntity
不是最好的,最好是
AddressType

将类本身标记为“ComplexType”,而不是包含类中的单个属性(例如,
FacilityLocation
):

不幸的是,EF并没有提供像我所知道的示例中的
columnprofix
映射那样简单的前缀重命名。您必须一个接一个地映射属性,并且必须使用Fluent API进行映射,使用数据注释无法实现这一点:

(在C#中):

modelBuilder.Entity()
.Property(a=>a.FacilityLocation.Street)
.HasColumnName(“FLStreet”);
modelBuilder.Entity()
.Property(a=>a.FacilityLocation.Suite)
.HasColumnName(“FLSuite”);
//等等。

对于实体框架,您所谓的“嵌套数据库类”的终端技术是

在EF术语中,它不是一个“实体”(它有自己的标识,在大多数情况下有自己的数据库表),因此名称
AddressEntity
不是最好的,最好是
AddressType

将类本身标记为“ComplexType”,而不是包含类中的单个属性(例如,
FacilityLocation
):

不幸的是,EF并没有提供像我所知道的示例中的
columnprofix
映射那样简单的前缀重命名。您必须一个接一个地映射属性,并且必须使用Fluent API进行映射,使用数据注释无法实现这一点:

(在C#中):

modelBuilder.Entity()
.Property(a=>a.FacilityLocation.Street)
.HasColumnName(“FLStreet”);
modelBuilder.Entity()
.Property(a=>a.FacilityLocation.Suite)
.HasColumnName(“FLSuite”);
//等等。

使用fluent API可以实现“复杂类型”吗?我问这个问题是因为我在使用AddressEntity时,使用的不仅仅是AMAStatementEntity,而且在这些地方它存储在自己的表中。我想我在这里找到了答案:好的,不确定我是否正确读取了该链接,但从我的角度来看,我必须使用2个不同的db上下文,1用于AddressEntity作为复杂类型使用时,当它不是的时候是1。@David:你不能混合。类可以是复杂类型,也可以是实体,有时不是这个,有时不是那个。您必须为此创建两个不同的类。使用fluent API可以使其成为“复杂类型”吗?我问这个问题是因为我在使用AddressEntity时,使用的不仅仅是AMAStatementEntity,而且在这些地方它存储在自己的表中。我想我在这里找到了答案:好的,不确定我是否正确读取了该链接,但从我的角度来看,我必须使用2个不同的db上下文,1用于AddressEntity作为复杂类型使用时,当它不是的时候是1。@David:你不能混合。类可以是复杂类型,也可以是实体,有时不是这个,有时不是那个。您必须为此创建两个不同的类。
CREATE TABLE [dbo].[AMA](
    [AMAId] [uniqueidentifier] NOT NULL,
    [DateOfService] [datetime] NULL,
    [FLStreet] [nvarchar](255) NULL,
    [FLSuite] [nvarchar](255) NULL,
    [FLCity] [nvarchar](255) NULL,
    [FLZipCode] [nvarchar](255) NULL,
    [FLCountry] [nvarchar](255) NULL,
    [FLState] [nvarchar](255) NULL,
    [BAStreet] [nvarchar](255) NULL,
    [BASuite] [nvarchar](255) NULL,
    [BACity] [nvarchar](255) NULL,
    [BAZipCode] [nvarchar](255) NULL,
    [BACountry] [nvarchar](255) NULL,
    [BAState] [nvarchar](255) NULL,
 CONSTRAINT [PK_AMA] PRIMARY KEY CLUSTERED 
(
    [AMAId] ASC
)
) ON [PRIMARY]
<ComplexType>
Public Class AddressEntity
'...
FacilityLocation_Street
FacilityLocation_Suite
modelBuilder.Entity<AMAStatementEntity>()
    .Property(a => a.FacilityLocation.Street)
    .HasColumnName("FLStreet");

modelBuilder.Entity<AMAStatementEntity>()
    .Property(a => a.FacilityLocation.Suite)
    .HasColumnName("FLSuite");

// etc.