首页 > 解决方案 > 如何使用 EF Database-First 方法来忽略影子属性以处理 Scaffold-DBContext 并生成单独的 Trackable 类

问题描述

我使用的是实体框架数据库优先方法,之前我使用了代码优先方法,并为公共属性创建了一个跟踪类,并从中继承所有实体,如下所示:

public abstract class Trackable
{
    public int Id { get; set; }
    public DateTime? CreatedDateTime { get; set; }
    public DateTime? UpdatedDateTime { get; set; }
    public int? CreatedUser { get; set; }
    public int? UpdatedUser { get; set; }
}

public class User: Trackable
{
    [Key]
    public new int Id { get; set; }
    [Required]
    [StringLength(255)]
    public string UserName { get; set; }
    [Required]
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool IsActive { get; set; }
}

上面的代码生成的单个表具有 User 和 Trackable 类中存在的所有属性。现在我需要在使用 Database-First 方法时生成相同的输出(我的意思是类)。

我已经尝试过,但它生成了一个User类,该类具有数据库内表中存在的所有属性。

谁能指导我,我应该做些什么来达到与我所做的 Code-First 相同的预期结果?

标签: c#asp.netentity-frameworkasp.net-core

解决方案


嗨@Muhammad Shahid Khan Afridi,</p>

上面的代码生成的单个表具有 User 和 Trackable 类中存在的所有属性。

根据您的课程,我在 DbContext 中添加了以下代码:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public DbSet<User> AppUsers { get; set; }
}

然后,首先使用 EF 代码进行迁移后,它将在数据库中创建一个 Users 表,如下所示:

在此处输入图像描述

谁能指导我,我应该做些什么来达到与我所做的 Code-First 相同的预期结果?

现在,您似乎想首先使用 EF 数据库生成相关类(具有继承),我假设您使用的是 ADO.Net 实体数据模型,如果是这种情况,在生成相关类之后,如您所说,我们只能在 .edmx 文件中获取单个 User 类,如下所示:

在此处输入图像描述

在这里您可以参考以下步骤来更改表格:

首先,右键单击用户实体,打开属性面板,更改“实体集名称”和“名称”属性。(将名称从“用户”更改为“DBF_Users”,这是为了防止Schema specified is not valid. Errors: The mapping of CLR type to EDM type is ambiguous because multiple CLR types match the EDM type 'User'错误)。

在此处输入图像描述

之后保存更改(单击确定按钮):

在此处输入图像描述

然后,如下更改用户类(记得添加 Table 属性以映射数据库中的表)并保存更改:

在此处输入图像描述

之后,您可以参考以下代码来使用genrested 类:

在此处输入图像描述


推荐阅读