【发布时间】:2012-01-08 21:55:36
【问题描述】:
我在使用自引用子类的实体框架和 TPC 继承方面遇到问题。
我的班级定义:
Public Class BaseObject
<Key()>
<DatabaseGenerated(DatabaseGeneratedOption.None)>
Public Overridable Property iId As Integer
<Required()>
Public Property iModUserId As Integer
<ForeignKey("iModUserId")>
Public Property ModUser As User
<Required()>
Public Property dtModDate As DateTime
End Class
Public Class User
Inherits BaseObject
<Required()>
Public Property sFirstName As String
<Required()>
Public Property sLastName As String
End Class
这是我的上下文
Public Class DBTestContext
Inherits DbContext
Public Property BaseObjects As DbSet(Of BaseObject)
Protected Overrides Sub OnModelCreating(modelBuilder As System.Data.Entity.DbModelBuilder)
modelBuilder.Entity(Of User)().Map(Sub(m)
m.MapInheritedProperties()
m.ToTable("tUsers")
End Sub)
End Sub
End Class
问题在于 Entity Framework 将外键 (FK) 关系设置为为“BaseClass”创建的表,而不是为“User”类创建的表。
这是一个主要问题,因为不应该向“BaseClass”表中插入任何内容,因此当我插入新用户时违反了外键约束:
Dim context As DBTestContext = New DBTestContext()
Dim user1 As User = New User()
user1.iId = 1
user1.iModUserId = 1
user1.dtModDate = DateTime.Now
context.Users.Add(user1)
context.SaveChanges() 'Error occurs here.
如果我删除继承,代码将完美运行。如果我删除“BaseObject”的 DBSer,然后没有为 BaseObject 创建表,该代码也可以工作,这很好,但是我不能轻易地搜索所有“BaseObjects”,这很糟糕(但不是必需的)。
这个“解决方案”的问题在于,当我添加下面的代码以获得更多的类定义时,“BaseObject”类的表重新出现(不知道为什么,有人可以解释一下吗?)并且外键关系是再次设置为“BaseObject”表。
Public Class BaseObject
<Key()>
<DatabaseGenerated(DatabaseGeneratedOption.None)>
Public Overridable Property iId As Integer
<Required()>
Public Property iModUserId As Integer
<ForeignKey("iModUserId")>
Public Property ModUser As User
<Required()>
Public Property dtModDate As DateTime
<InverseProperty("BaseObjects")>
Public Overridable Property Group As ICollection(Of Group)
End Class
Public Class User
Inherits BaseObject
<Required()>
Public Property sFirstName As String
<Required()>
Public Property sLastName As String
End Class
<Table("tGroups")>
Public Class Group
Inherits BaseObject
<InverseProperty("Groups")>
Public Overridable Property BaseObjects As ICollection(Of BaseObject)
End Class
有没有办法解决这个问题,以便将外键关系设置为“User”表(类),而不是“BaseObject”表?
我尝试过使用以下 Fluent API,但结果是一样的:
modelBuilder.Entity(Of User)().HasRequired(Function(u) u.ModUser).WithMany().HasForeignKey(Function(u) u.iModUserId)
【问题讨论】:
标签: entity-framework-4.1 ef-code-first