【发布时间】:2016-01-27 17:01:26
【问题描述】:
我有一个 EF 4 解决方案,我正在尝试迁移到更新的 EF(和 .net) 我已经升级了 EF 并修复了所有项目,以便处理 EF 6 和新的目标平台。 问题是 EF4 和 6 以不同的方式处理 db 中的类继承。我有一个继承 User 类的 BackendUser 类。在 db 中,BackendUser 表将具有 BackendUser 属性和一个将获取用户属性的 UserId
升级 EF 时会尝试从 User 表中获取所有数据并使用 Discriminator 属性来处理类。
我猜我必须要么将 db 转换为新方式,要么将 EF 设置为以“旧”方式处理继承。我也猜测新方法的性能可能会更好?
是否有任何最佳实践如何处理此问题以获取新数据库结构的旧解决方案,或者我是否正在花费数小时手动更新数据库?
编辑:找到有关 TPT 和添加类的更多信息,所以我猜 EF 出于某种原因不处理表属性? (省略了一些道具)
[Table("ResellerContact")]
public class ResellerContact : BackendUser
{
public string ResellerName {get; set; }
}
[Table("BackendUser")]
public class BackendUser : User
{
public bool IsSystemOwner { get; set;}
}
public abstract class User
{
public long UserId { get; set; }
[Required(ErrorMessage = "*")]
[StringLength(15, ErrorMessageResourceName = "UsernameValidationMessage", ErrorMessageResourceType = typeof(UserResource))]
[Display(Name = "Username", ResourceType = typeof(ResellerContactResource))]
public string UserName { get; set;}
}
在下面的sql中获取一个后端用户结果
SELECT TOP (2)
[Extent1].[Discriminator] AS [Discriminator],
[Extent1].[UserId] AS [UserId],
[Extent1].[UserName] AS [UserName],
[Extent1].[Email] AS [Email],
[Extent1].[Password] AS [Password],
[Extent1].[RoleId] AS [RoleId],
[Extent1].[IsSystemOwner] AS [IsSystemOwner],
[Extent1].[FullName] AS [FullName],
[Extent1].[Phone1] AS [Phone1],
[Extent1].[Mobile1] AS [Mobile1],
[Extent1].[ResellerContactType] AS [ResellerContactType],
[Extent1].[Language1] AS [Language1],
[Extent1].[ResellerId] AS [ResellerId],
[Extent1].[IsActive1] AS [IsActive1]
FROM [dbo].[User] AS [Extent1]
WHERE ([Extent1].[Discriminator] IN (N'ResellerContact',N'BackendUser')) AND ([Extent1].[UserName] = @p__linq__0) AND ([Extent1].[Password] = @p__linq__1)
【问题讨论】:
标签: c# entity-framework inheritance