将数据注释与流畅的 API 相结合会抛出 EntityType 没有为上下文中的每个 class 定义键
Mixing data annotations with fluent API throws EntityType has no key defined for every class in context
所以我有一个现有的 class,看起来像这样:
Public Class Song
<Key>
Public Property GUID As Guid
<ForeignKey("Creator")>
Public Property GUID_Creator As Guid
Public Property Creator As User
End Class
这很完美,我可以添加新歌等等。
最近,我决定我需要使用 Fluent API 映射一些东西,但我不想使用 API 重新制作我的整个模型,我所需要的只是禁用级联删除。
所以我去了onModelCreating
,添加
modelBuilder.Entity(Of Song) _
.HasRequired(Function(s) s.Creator) _
.WithMany(Function(u) u.Songs) _
.HasForeignKey(Function(s) s.GUID_Creator) _
.WillCascadeOnDelete(False)
刚才补充的,这个方法之前是空的。在此之后启动应用程序时(我启用了自动迁移)并使用上下文,突然我在我的上下文中得到每个 CLASS 的异常,说:
EntityType 'Song' has no key defined
EntityType 'User' has no key defined
等我在 Google 上搜索了同时使用 Fluent API 和 Data Annotations 的人,并找到了一些人。在 Fluent API 中添加 HasKey
解决了它,但我不想在 OnModelCreating
中重新制作每个 class。
那我该怎么做呢?是否可以混合使用 Fluent API 和数据注释?
尝试从您的实体调用中删除行 .HasKey(Function(s) s.GUID) _
,因为您已经通过 Data Annotations 定义了它并且您只想设置 关系:
modelBuilder.Entity(Of Song) _
.HasRequired(Function(s) s.Creator) _
.WithMany(Function(u) u.Songs) _
.HasForeignKey(Function(s) s.GUID_Creator) _
.WillCascadeOnDelete(False)
应该是这样的。也许这个 会对你有所帮助。
但我不得不建议您避免混合使用 Data Annotations 和 FluentAPI,因为将实体定义拆分到不同的文件中会更容易出错!
好吧,我发现了我的错误,我觉得我真的很愚蠢:D
我在我的项目中有两个 classes:
Public Class Song 'Class for use in my apps and services
Public Class EF_Song 'Class for use with Entity Framework
所以整个问题是我使用 class Song
而不是 EF_Song
。
抛出的异常几乎是所有 "standard" classes,因为它试图根据它们与 Song
class 的关系将它们加载到模型中(显然, classes not meant for use with Entity Framework didn't have keys defined).
所以我有一个现有的 class,看起来像这样:
Public Class Song
<Key>
Public Property GUID As Guid
<ForeignKey("Creator")>
Public Property GUID_Creator As Guid
Public Property Creator As User
End Class
这很完美,我可以添加新歌等等。
最近,我决定我需要使用 Fluent API 映射一些东西,但我不想使用 API 重新制作我的整个模型,我所需要的只是禁用级联删除。
所以我去了onModelCreating
,添加
modelBuilder.Entity(Of Song) _
.HasRequired(Function(s) s.Creator) _
.WithMany(Function(u) u.Songs) _
.HasForeignKey(Function(s) s.GUID_Creator) _
.WillCascadeOnDelete(False)
刚才补充的,这个方法之前是空的。在此之后启动应用程序时(我启用了自动迁移)并使用上下文,突然我在我的上下文中得到每个 CLASS 的异常,说:
EntityType 'Song' has no key defined
EntityType 'User' has no key defined
等我在 Google 上搜索了同时使用 Fluent API 和 Data Annotations 的人,并找到了一些人。在 Fluent API 中添加 HasKey
解决了它,但我不想在 OnModelCreating
中重新制作每个 class。
那我该怎么做呢?是否可以混合使用 Fluent API 和数据注释?
尝试从您的实体调用中删除行 .HasKey(Function(s) s.GUID) _
,因为您已经通过 Data Annotations 定义了它并且您只想设置 关系:
modelBuilder.Entity(Of Song) _
.HasRequired(Function(s) s.Creator) _
.WithMany(Function(u) u.Songs) _
.HasForeignKey(Function(s) s.GUID_Creator) _
.WillCascadeOnDelete(False)
应该是这样的。也许这个
但我不得不建议您避免混合使用 Data Annotations 和 FluentAPI,因为将实体定义拆分到不同的文件中会更容易出错!
好吧,我发现了我的错误,我觉得我真的很愚蠢:D
我在我的项目中有两个 classes:
Public Class Song 'Class for use in my apps and services
Public Class EF_Song 'Class for use with Entity Framework
所以整个问题是我使用 class Song
而不是 EF_Song
。
抛出的异常几乎是所有 "standard" classes,因为它试图根据它们与 Song
class 的关系将它们加载到模型中(显然, classes not meant for use with Entity Framework didn't have keys defined).