当前位置: 首页 > 面试题库 >

如何指定实体框架核心表映射?

苏星宇
2023-03-14
问题内容

我已经制作了一个简单的Entity Framework ASP Core Application,它可以工作,但是我不知道为什么:

我做了这样的上下文:

public class AstootContext : DbContext
{
    public AstootContext(DbContextOptions<AstootContext> options)
        : base(options)
    { }

    public DbSet<Account> Accounts { get; set; }
    public DbSet<User> Users { get; set; }
}

我有两个表,像这样的模型:

public class Account
{
    public int Id { get; set; }
    public string Username { get; set; }
    public string PasswordHash { get; set; }
    public DateTime Created { get; set; }

    List<User> Users { get; set; }
}

public class User
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public DateTime Birthday { get; set; }
    public Account Account { get; set; }
}

有趣的是,当我运行我的应用程序时,它实际上可以拾取数据。似乎很奇怪,因为我没有指定任何表映射。我假设这只是自动映射,因为指定的表具有相同的名称。

我的问题是:

  1. 如果我不希望模型名称与数据库完全相同,该如何指定表显式表映射?

  2. 如何指定自定义列映射。

  3. 我必须为主/外键指定什么特别的东西吗

编辑

澄清

  1. 说我在数据库MyAccounts中有一个表,我想将该表映射到实体Accounts。

  2. 假设我有一个列密码,并且希望该密码映射到POCO属性PasswordHash


问题答案:
  1. 要指定数据库表的名称,可以使用属性或流利的API:

使用属性:

    [Table("MyAccountsTable")]
public class Account
{
     public string PasswordHash { get; set; }
}

使用Fluent API:

    public class YourContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Language>(entity => {
            entity.ToTable("MyAccountsTable");
        });
    }
}
  1. 要手动命名列,这非常相似,您可以使用属性或流畅的API:

使用属性:

    public class Account
{
    [Column("MyPasswordHashColumn")]
    public string PasswordHash { get; set; }

}

使用Fluent API:

    public class YourContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<Language>(x => x
            .ToTable("MyAccountsTable")
            .Property(entity => entity.PasswordHash)
                .HasField("MyPasswordHashColumn")
        );
    }
}


 类似资料:
  • 我试图使用实体框架核心从我的表中检索一行。这似乎很简单,但我无法让它工作。 我可以通过使用获得列表 _上下文。国家。ToList(); 这给了我表格中国家的完整列表。现在我只需要得到一个与ID匹配的国家。如何做到这一点,因为EF核心中缺少Find()。我们可以选择在哪里吗。谁能帮我理解一下语法吗。 我的国家/地区模型如下所示 公共部分类COUNTRY{public string COUNTRYID

  • 我有一个ASP MVC.NET核心(C#)项目,由于业务原因,SQL表不能有外键,因此,EF模型不映射关系(Entity.HasMany...)。 假设EF为实体生成一个模型,为生成一个模型。我想知道他们两个之间的关系。一个有多个并且一个属于一个。该任务在数据库中有项目Id(但请记住,它没有设置为FK)。 现在,我想通过to Entity获得一个项目列表,同时获得每个项目的任务列表。我通过创建一个

  • 我有一个带有表的旧数据库,该表只有一行,没有主键。当我尝试更新此行时,什么都没有发生。我搜索了很多,找到了这行代码(dbf.Entry(nextPro))。状态=实体状态。已修改;) 。添加此代码时,我遇到了错误:“无法跟踪类型为‘NxtId’的实例,因为它没有主键。只能跟踪具有主键的实体类型。” 我无法删除该行并添加新行。我无法添加主键。我有唯一的选择来以某种方式更新行。 实体:

  • 我已经将读上下文和写上下文分开了,现在我将在默认情况下在ReadOnlyContext中启用LazyLoading。我也使用了下面的方法,但不幸的是它不起作用。 我的模型: 我的ef版本: EntityFramework核心版本2.1.2 我得到了这个错误: “为警告‘Microsoft.EntityFrameworkCore.Infrastructure.DetachedLazyLoadingW

  • 我已经找到了几个这样的帖子,但不能确定我在这里做错了什么。 我试着在两张桌子上各放一个项目。第二项包含对第一项的查找。我可以在没有问题的情况下为父级添加种子,但无法找到正确的语法来为子级添加种子。 下面是我用来种子父级的代码 下面是种子子的代码--这将失败: 根据文档的建议,我使用了一个匿名对象,而不是类本身。我也尝试过同时使用navigation属性、外键和nav道具。ID=1的组肯定已经在db

  • 我想使用即时加载在实体框架核心中获得多个嵌套级别的子表。我认为延迟加载还没有实现。 我找到了EF6的答案。 我的问题是,EF Core中无法识别选择 错误CS1061“雇员”不包含“选择”的定义,并且找不到接受“雇员”类型的第一个参数的扩展方法“选择”(您是否缺少使用指令或程序集引用?) 我包含的命名空间: EF Core中的选择选项是什么。