2

我有一张FeeMetadata带 PK的桌子FeeID BIGINT IDENTITY(1,1) NOT NULL

此表包含两个 1-1 关系。一到PFD.Fees,一到SoaCourt.Fees通过FeeID列(三个表同名,只有元数据表标记为IDENTITY,其他两个表此列是PK但不是标识)

这是 EF 类的代码:

Namespace PFD

    <Table("FeeMetadata", Schema:="PFD")>
    Public Class FeeMetadata
        Public Sub New()
            MyBase.New()
        End Sub

        Public Sub New(ByVal tFee As SOACourt_v1)
            Me.New()

            Me.GroupKey = tFee.DriverLicenseNumber
            Me.PfdFee = New PFD.Fee(tFee)
            Me.SoaCourtFee = New SoaCourt.Fee(tFee)
        End Sub

        <Key>
        <DatabaseGenerated(DatabaseGeneratedOption.Identity)>
        Public Property FeeID As Int64

        ' Other domain-specific properties...

        Public Property SoaCourtFee As SoaCourt.Fee
    End Class
End Namespace


Namespace PFD
    <Table("Fees", Schema:="PFD")>
    Public Class Fee
        Public Sub New()
            MyBase.New()
        End Sub

        Public Sub New(ByVal tFee As SOACourt_v1)
            Me.New()

            Me.Amount = tFee.Amount
        Me.DueDate = tFee.DueDate
        End Sub

        <Key>
        <ForeignKey("MetaData")>
        <DatabaseGenerated(DatabaseGeneratedOption.None)>
        Public Property FeeID As Int64

        ' Other domain-specific properties...

        Public Property MetaData As FeeMetadata
    End Class
End Namespace


Namespace SoaCourt
    <Table("Fees", Schema:="SoaCourt")>
    Public Class Fee
        Public Sub New()
            MyBase.New()
        End Sub

        Public Sub New(ByVal tFee As SOACourt_v1)
            Me.New()

            Me.CaseID = tFee.CaseID
            Me.CaseNumber = tFee.CaseNumber
            Me.TicketNumber = tFee.TicketNumber
        End Sub

        <Key>
        <ForeignKey("MetaData")>
        <DatabaseGenerated(DatabaseGeneratedOption.None)>
        Public Property FeeID As Int64

        ' Other domain-specific properties 

        Public Property MetaData As PFD.FeeMetadata
    End Class
End Namespace

编辑:创建和持久化数据库实体的代码:

Using tContext As FeesContext = New FeesContext
    For Each tFee As SOACourt_v1 In tFees
        tContext.FeeMetadata.Add(New PFD.FeeMetadata(tFee))
    Next
    tContext.SaveChanges()
End Using

我遇到的问题是 SoaCourt.Fee 实体没有被持久化到数据库中。PFD.FeeMetadata 和 PFD.Fee 都正确保存,但 SoaCourt.Fee 不是。

关于如何解决这个问题的任何想法?

4

2 回答 2

0

The answer to this question is the solution here.

In summary: EF5 can not persist classes of the same name from different namespaces. Entity class names must be unique across namespaces.

于 2013-01-01T18:42:31.920 回答
0

我相信您需要将这些导航属性标记为OverridableVB.NET

         Public Overridable Property MetaData As FeeMetadata

这允许在 EntityFramework 使用时覆盖该属性,否则会将其视为本地(未映射)属性。

VB.NET 可覆盖关键字

数据库生成属性

以上是错误的。 virtual(C#) 和Overridable(VB.NET) 用于允许延迟加载关联实体。

是否有可能因为该<DatabaseGenerated(DatabaseGeneratedOption.None)>属性而做一些有趣的事情?您不应该在外键属性上需要它。EF 将自行处理外键的分配,并且因为您指定它不是数据库生成的,所以它期望您显式分配一个值?

特性

您还拥有作为 Key 和 ForeignKey 列出的相同属性 (FeeID)。

FeeID 应该仍然是一个键,并且您应该有一个 MetadataID 的第二个属性,标记为 ForeignKey。即使您可能希望所有关联记录都具有相同的键值(如果它有效,您帖子中的代码将完成),但很可能在某些时候您将需要这种重新关联的方式这些对象。最好从一开始就设计它。

就我个人而言,我会将 Metadata 类更改为类似的东西,并根据需要在其他类上效仿:

<Table("FeeMetadata", Schema:="PFD")>
Public Class FeeMetadata
    Public Sub New()
        MyBase.New()
    End Sub

    Public Sub New(ByVal tFee As SOACourt_v1)
        Me.New()

        Me.GroupKey = tFee.DriverLicenseNumber
        Me.PfdFee = New PFD.Fee(tFee)
        Me.SoaCourtFee = New SoaCourt.Fee(tFee)
    End Sub

    <Key>
    Public Property FeeMetadataID as Int64

    Public Property SoaFeeID As Int64
    Public Property PfdFeeID As Int64

    <ForeignKey("SoaFeeID")>
    Public Property SoaCourtFee As SoaCourt.Fee
    <ForeignKey("PfdFeeID")>
    Public Property PfdFee As PFD.Fee
End Class

这表示一个包含三个字段的表:一个主键(FeeMetadataID)和两个外键(SoaCourtFeeID 和 PfdFeeID)。导航属性使用属性中的外键值来创建关系。除了属性声明本身之外,这些导航属性的另一端实际上不需要任何东西。在这种情况下,我很确定,甚至没有外键属性。所以 SOACourt.Fee 可以简单地是 Key 属性,无论您想要什么数据属性,以及一个简单Public Overridable Property Metadata as FeeMetadata的描述导航回元数据的方式。

于 2012-12-21T20:28:16.437 回答