2

FeeMetadataPK付きのテーブルがありますFeeID BIGINT IDENTITY(1,1) NOT NULL

このテーブルには、2つの1-1の関係が含まれています。1つは列PFD.Feesを経由し、もう1つは列をSoaCourt.Fees経由しFeeIDます(3つのテーブルすべてで同じ名前、メタデータテーブルのみがIDENTITYとしてマークされ、他の2つのテーブルはPKですが、IDではありません)

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

OverridableこれらのナビゲーションプロパティをVB.NETのようにマークする必要があると思います

         Public Overridable Property MetaData As FeeMetadata

これにより、EntityFrameworkで使用するときにプロパティをオーバーライドできます。オーバーライドしない場合は、ローカル(マップされていない)プロパティとして扱われます。

VB.NETオーバーライド可能なキーワード

DatabaseGenerated属性

上記は誤りです。 virtual(C#)およびOverridable(VB.NET)は、関連付けられたエンティティの遅延読み込みを可能にするために使用されます。

<DatabaseGenerated(DatabaseGeneratedOption.None)>属性のせいで何かおかしなことをしている可能性はありますか?外部キープロパティでは必要ありません。EFはそれ自体で外部キーの割り当てを処理します。また、データベース生成ではないことを指定しているため、明示的に値を割り当てることを期待していますか?

プロパティ

KeyおよびForeignKeyとしてリストされている同じプロパティ(FeeID)もあります。

FeeIDはキーのままである必要があり、ForeignKeyとしてマークされたMetadataIDの2番目のプロパティが必要です。関連付けられたすべてのレコードに同じキー値(投稿内のコードが機能した場合に達成される)を持たせたい場合でも、ある時点で再関連付けの方法が必要になる可能性があります。これらのオブジェクト。最初から設計する方が良いでしょう。

個人的には、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

これは、1つの主キー(FeeMetadataID)と2つの外部キー(SoaCourtFeeIDとPfdFeeID)の3つのフィールドを持つテーブルを表します。ナビゲーションプロパティは、属性の外部キー値を使用して関係を作成します。これらのナビゲーションプロパティのもう一方の端には、プロパティ宣言自体以外に実際には何も必要ありません。この場合、外部キー属性でさえなくても、私はかなり確信しています。したがって、SOACourt.Feeは、必要なデータプロパティが何であれ、単純にKeyプロパティでありPublic Overridable Property Metadata as FeeMetadata、メタデータに戻るナビゲーションを簡単に記述することができます。

于 2012-12-21T20:28:16.437 に答える
0

この質問に対する答えは、ここでの解決策です。

要約すると、EF5は、異なる名前空間からの同じ名前のクラスを永続化することはできません。 エンティティクラス名は、名前空間全体で一意である必要があります。

于 2013-01-01T18:42:31.920 に答える