1

我正在尝试为其中一个列是另一个表的 FK 的类定义复合 PK。代码编译没有任何错误,但是当我尝试迁移更改时出现以下错误

PM> Update-Database -Force -TargetMigration:0
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
System.InvalidOperationException: The properties expression 'x => new VB$AnonymousType_0`2(RtepNumber = x.RtepNumber, ContractId = x.Contract.ContractId)' is not valid. The expression should represent a property: C#: 't => t.MyProperty'  VB.Net: 'Function(t) t.MyProperty'. When specifying multiple properties use an anonymous type: C#: 't => new { t.MyProperty1, t.MyProperty2 }'  VB.Net: 'Function(t) New With { t.MyProperty1, t.MyProperty2 }'.

The properties expression 'x => new VB$AnonymousType_0`2(RtepNumber = x.RtepNumber, ContractId = x.Contract.ContractId)' is not valid. The expression should represent a property: C#: 't => t.MyProperty'  VB.Net: 'Function(t) t.MyProperty'. When specifying multiple properties use an anonymous type: C#: 't => new { t.MyProperty1, t.MyProperty2 }'  VB.Net: 'Function(t) New With { t.MyProperty1, t.MyProperty2 }'.

但是,据推测导致异常的那个似乎确实在请求的语法中。

给定以下课程

Public Class ParentClass
   Public Property ParentClassId as String

   Public Property Title As String

   Public Property ChildClasses As ICollection(Of ChildClass)
End Class

Public Class ChildClass      
   Public Property ParentClass As ParentClass

   Public Property ChildClassId As String

   Public Property Title As String
End Class

以及以下 Fluent API 代码

Protected Overrides Sub OnModelCreating(ByVal modelBuilder As System.Data.Entity.DbModelBuilder)
   MyBase.OnModelCreating(modelBuilder)

   modelBuilder.Entity(Of Models.ChildClass).HasRequired(Function(x) x.ParentClass).WithMany(Function(x) x.ChildClasses).Map(Function(x) x.MapKey("ContractId"))

   modelBuilder.Entity(Of Models.ChildClass).HasKey(Function(x) New With {x.ParentClass.ParentClassId, x.ChildClassId})
End Sub

等效的 SQL 代码是

CREATE TABLE [dbo].[ParentClass](
    [ParentClassId] [nvarchar](10) NOT NULL,
    [Title] [nvarchar](25) NOT NULL,
 CONSTRAINT [PK_ParentClass] PRIMARY KEY CLUSTERED 
(
    [ParentClassId] ASC
)
)
GO

CREATE TABLE [dbo].[ChildClass](
    [ParentClassId] [nvarchar](10) NOT NULL,
    [ChildClassId] [nvarchar](10) NOT NULL,
    [Title] [nvarchar](25) NOT NULL,
 CONSTRAINT [PK_ChildClass] PRIMARY KEY CLUSTERED 
(
    [ParentClassId] ASC,
    [ChildClassId] ASC
)
)
GO

ALTER TABLE [dbo].[ChildClass]  WITH CHECK ADD  CONSTRAINT [FK_ChildClass_ParentClass] FOREIGN     KEY([ParentClassId])
REFERENCES [dbo].[ParentClass] ([ParentClassId])
GO

ALTER TABLE [dbo].[ChildClass] CHECK CONSTRAINT [FK_ChildClass_ParentClass]
GO

感谢您提供任何帮助。

编辑:

经过更多的研究(即实验),问题似乎源于在 PK 定义中使用导航属性。所以改变代码看起来像

Public Class ChildClass      
   Public Property ParentClassId As String

   Public Property ChildClassId As String

   Public Property Title As String
End Class

Protected Overrides Sub OnModelCreating(ByVal modelBuilder As System.Data.Entity.DbModelBuilder)
   MyBase.OnModelCreating(modelBuilder)

   modelBuilder.Entity(Of Models.ChildClass).HasKey(Function(x) New With {x.ParentClassId, x.ChildClassId})
End Sub

清除异常,但当然,我现在在 ChildClass 中丢失了 ParentClass 导航属性。

还是一头雾水。

4

2 回答 2

0

看来您必须在子类中具有标量属性。只能使用显式标量属性定义键。

于 2012-10-09T13:17:48.330 回答
0

您可以将导航属性保留在您的课程中......

Public Class ChildClass      
    Public Property ParentClassId As String

    Public Property ChildClassId As String

    Public Property Title As String

    Public Property ParentClass As ParentClass
End Class

...然后在您的映射中使用HasForeignKey而不是:MapKey

modelBuilder.Entity(Of Models.ChildClass). _
    HasKey(Function(x) New With {x.ParentClassId, x.ChildClassId})

modelBuilder.Entity(Of Models.ChildClass). _
    HasRequired(Function(x) x.ParentClass). _
    WithMany(Function(x) x.ChildClasses). _
    HasForeignKey(Function(x) x.ParentClassId)

如果外键在数据库表中有另一个名称,则添加列名映射:

modelBuilder.Entity(Of Models.ChildClass). _
    Property(Function(x) x.ParentClassId). _
    HasColumnName("ContractId")
于 2012-10-07T13:12:20.280 回答