1

列の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

そして次のFluentAPIコード

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

クラスでナビゲーションプロパティを保持できます...

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 に答える
0

子クラスにスカラープロパティが必要なようです。キーは、明示的なスカラープロパティを使用してのみ定義できます。

于 2012-10-09T13:17:48.330 に答える