【问题标题】:EF Core DBContext targeting only part of the databaseEF Core DBContext 仅针对数据库的一部分
【发布时间】:2019-05-16 11:56:30
【问题描述】:

我想问一下,是否可以在 Entity Framework Core 中只针对一个带有 DbContext 的表?

简而言之,我有一个系统可以管理有关数据库的所有内容以及其中的所有表,但现在我正在编写新系统,它使用相同的数据库,但只需要其中一个表。另外我真的不需要方法OnModelCreating等中的所有实体...

假设我有类似的东西:

        public virtual DbSet<Admin> Admins { get; set; }
        public virtual DbSet<User> Users { get; set; }        
        public virtual DbSet<Project> Projects { get; set; }        
        public virtual DbSet<AdminProject> AdminProjects { get; set; }        
        public virtual DbSet<UserProject> UserProjects { get; set; }        

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
           // something
        }        

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            //modelBuilder for all of the tables
        }

但我更愿意只是:

        public virtual DbSet<Project> Projects { get; set; }        

后来在OnModelCreating 中只是为项目实体建模。

感谢大家的帮助

【问题讨论】:

  • 您可以只对您想要的表格进行建模,您不需要包含所有内容(如果您要插入,请注意外键等)

标签: c# entity-framework asp.net-core entity-framework-core


【解决方案1】:

您可以使用映射。 首先创建您将使用的表的模型。喜欢

 public class Foo
    {

        public string Id { get; set; }
        public string Name { get; set; }
        public string Phone { get; set; }
    }

经过 crate 映射类

 public class FooMapping : IEntityTypeConfiguration<Foo>
    {
        public void Configure(EntityTypeBuilder<Foo> builder)
        {
            builder.ToTable("FooTable");
            builder.Property(c => c.Id).HasColumnName("nameofyourcolumninsqltable").IsRequired();;
            builder.Property(c => c.Name).HasColumnName("nameofyourcolumninsqltable");;
            builder.Property(c => c.Phone).HasColumnName("nameofyourcolumninsqltable");
        }
    }

最后在 DbContex 中初始化

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

        }
        public Context()
        {

        }
        public DbSet<Foo> Foos { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.ApplyConfiguration(new FooMapping());
            base.OnModelCreating(modelBuilder);
        }
    }

【讨论】:

    【解决方案2】:

    假设您的新项目使用原始DbContext副本,您可以简单地删除不需要的任何内容。

    除非您从新上下文创建迁移这不会更改您的数据库


    可能值得一提: 代码优先的方法,即根据您的代码生成数据库,通常由共享的 DbContext 管理,因为您不能拥有多个 @987654323 @ 单个数据库中的表。

    【讨论】:

      【解决方案3】:

      您可以使用 Entity Framework Core 的 db first 方法

      Scaffold-DbContext "{Connection String}" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -t {TableName}
      

      如果您使用连接字符串更改 {Connection String} 并使用您的表名更改 {TableName},它将创建您的表实体。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-19
        • 1970-01-01
        • 2020-04-07
        • 1970-01-01
        相关资源
        最近更新 更多