1

Sql 2008 r2 と Visual Studio 2010 と EF 4.4 を使用しています。そして、コードを長く実行すると、このエラーが発生します。コードは、データベースの関係を説明する必要があります。

モデル生成中に 1 つ以上の検証エラーが検出されました: \tSystem.Data.Entity.Edm.EdmAssociationConstraint: : 関係制約内の依存ロールとプリンシパル ロールのプロパティの数は同じでなければなりません。

データ注釈を使用してこれを解決したい。私は何をしているのですか?

'オファー

    Public Class Offer

        <Key(), DatabaseGenerated(DatabaseGeneratedOption.None)>
        Public Property Offer_ID As Integer
        Public Property Name As String

    End Class

'頭

Public Class Head

    <Key(), Column(Order:=0), DatabaseGenerated(DatabaseGeneratedOption.None)>
    Public Property Head_ID As Integer

    <ForeignKey("Offer_ID")>
    Public Property Offer As Offer

    <Key(), Column(Order:=1)>
    Public Property Offer_ID As Integer

    Public Property Name As String


End Class

'ライン

   Public Class Line

        <Key(), Column(Order:=0), DatabaseGenerated(DatabaseGeneratedOption.None)>
        Public Property Line_ID As Integer

        <ForeignKey("Head_ID")>
        Public Property Head As Head

        <Key(), Column(Order:=1)>
        Public Property Head_ID As Integer

        <ForeignKey("Offer_ID")>
        Public Property Offer As Offer

        <Key(), Column(Order:=2)>
        Public Property Offer_ID As Integer

        Public Property Name As String

   End Class

'DbContext

    Public Class DatabaseContext
        Inherits DbContext

        Public Sub New(p_ConnectionString As String)
            MyBase.New(p_ConnectionString)
        End Sub

        Public Property Offers As DbSet(Of Offer)
        Public Property Heads As DbSet(Of Head)
        Public Property Lines As DbSet(Of Line)

    End Class

'簡単なサンプルを作成

    Private Shared Sub CreateME()

        Dim offer As New Offer
        offer.Name = "Offer1"
        offer.Offer_ID = 1

        Dim head As New Head
        head.Head_ID = 1
        head.Name = "head1"
        head.Offer = offer
        head.Offer_ID = offer.Offer_ID

        Dim line As New Line
        line.Head = head
        line.Head_ID = head.Head_ID
        line.Line_Id = 1
        line.Name = "line1"
        line.Offer = offer
        line.Offer_ID = offer.Offer_ID

        Using context = New DatabaseContext(GetConnectionString())

            context.Offers.Add(offer)
            context.Heads.Add(head)
            context.Lines.Add(line)
            context.SaveChanges()
        End Using

    End Sub

問題は、データ注釈を使用してこれを解決できるかどうかです。

ここで説明されているモデルビルダーを使用する 必要がありますか: 修正方法: 関係制約内の従属ロールと主ロールのプロパティの数は同じでなければなりませんか?

4

2 に答える 2

2

まず、あなたのデータベース関係はこれを望んでいると思いますが、正しいですか?

データベース関係

  • Offersの単純な主キーを持つOffer_ID
  • HeadsHead_IDandの複合主キーを持つOffer_ID
  • Heads~への外部キーを持っているOffers
  • Linesの複合主キーを持ちLine_IDHead_IDかつOffer_ID
  • Lines~への外部キーを持っているHeads

あなたの質問を読んで私が正しいと仮定すると...


あなたのコードはほぼ完璧です。唯一のものはLineクラスです。ここでは、次を指定しています。

<ForeignKey("Head_ID")>
Public Property Head As Head

ただし、代わりに次のものが必要です。

<ForeignKey("Head_ID, Offer_ID")>
Public Property Head As Head

トリッキーなコンマ区切りの文字列に至るまですべてです!

その理由は、Heads の主キーが複合であるため、関係を正しくするにはすべての列を指定する必要があるためです。

于 2013-02-20T14:24:22.220 に答える
1

Headクラスには、Head_IdとOfferIdで構成される外部キーがあります。Lineクラスは、HeadIdとOfferIdで構成される外部キーを介してHeadを参照する必要があります。

データ注釈と列順序構文を使用できます。正確な構文はMSDNで見つけることができるはずです。

于 2013-02-19T15:40:51.900 に答える