【问题标题】:Fix One or more validation errors were detected during model generation using dataannotation修复 在使用数据注释生成模型期间检测到一个或多个验证错误
【发布时间】:2013-02-04 05:18:29
【问题描述】:

我正在使用 Sql 2008 r2 和 Visual Studio 2010 和 EF 4.4。而且我在运行代码时遇到了这个错误。代码应该解释数据库关系。

在模型生成过程中检测到一个或多个验证错误: \tSystem.Data.Entity.Edm.EdmAssociationConstraint: : 关系约束中的 >Dependent 和 Principal Roles 中的属性数量必须相同。

我想使用数据注释来解决这个问题。我在做什么?

'报价

    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

那么问题是我可以使用数据注释来解决这个问题吗?

我是否必须使用此处解释的模型构建器: How to fix: The number of properties in the Dependent and Principal Roles in a relationship constraint must be identical?

【问题讨论】:

    标签: .net sql ef-code-first


    【解决方案1】:

    首先,我认为您的数据库关系应该是这样的,对吗?

    • Offers 有一个简单的主键 Offer_ID
    • Heads 有一个复合主键 Head_IDOffer_ID
    • Heads 有一个指向 Offers 的外键
    • Lines 有一个复合主键 Line_IDHead_IDOffer_ID
    • Lines 有一个指向 Heads 的外键

    假设我在阅读您的问题时是正确的......


    您的代码几乎完美无缺。唯一的就是Line 类。您在这里指定:

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

    但你需要:

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

    全部归结为一个棘手的逗号分隔字符串!

    原因是 Heads 上的主键是复合的,因此您必须指定所有列才能使关系正确。

    【讨论】:

    • 谢谢,即使有图片也能很好地回答。我现在没有一个注释中可以有两个外键。在网络上使用数据注释的更复杂的数据库示例很少-我认为您也可以这样做: Public Property Head As Head Public Property Head_ID As Integer Public Property Offer_ID As Integer
    【解决方案2】:

    您的 Head 类有一个由 Head_Id 和 Offer Id 组成的外键。您的 Line 类需要通过由 Head Id 和 Offer Id 组成的外键引用 Head。

    您可以使用数据注释和列顺序语法。你应该可以在 MSDN 上找到确切的语法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 2017-12-16
      • 1970-01-01
      • 2013-02-13
      相关资源
      最近更新 更多