Entity framework 编辑数据库上下文以从相关实体获取名称

Entity framework 编辑数据库上下文以从相关实体获取名称,entity-framework,dbcontext,Entity Framework,Dbcontext,我是VS2019、EF和.net Core 3.1的新手,所以请耐心听我说 dbcontext modelBuilder.Entity<Books>(entity => { entity.Property(e => e.Id).HasColumnName("id"); entity.Property(e => e.Createdon)

我是VS2019、EF和.net Core 3.1的新手,所以请耐心听我说

dbcontext

        modelBuilder.Entity<Books>(entity =>
        {
            entity.Property(e => e.Id).HasColumnName("id");

            entity.Property(e => e.Createdon)
                .HasColumnName("createdon")
                .HasColumnType("datetime")
                .HasDefaultValueSql("(getdate())");

            entity.Property(e => e.Goal)
                .HasColumnName("goal")
                .HasMaxLength(100)
                .IsUnicode(false);

            entity.Property(e => e.Grade)
                .HasColumnName("grade")
                .HasMaxLength(2)
                .IsUnicode(false);

            entity.Property(e => e.Subjectid).HasColumnName("subjectid");

            entity.HasOne(d => d.Subject)
                .WithMany(p => p.Books)
                .HasForeignKey(d => d.Subjectid)
                .HasConstraintName("FK_Books_Subjects");
        });

        modelBuilder.Entity<Subjects>(entity =>
        {
            entity.Property(e => e.Id).HasColumnName("id");

            entity.Property(e => e.Createdby).HasColumnName("createdby");

            entity.Property(e => e.Name)
                .HasColumnName("name")
                .HasMaxLength(50)
                .IsUnicode(false);
        });
modelBuilder.Entity(Entity=>
{
Property(e=>e.Id).HasColumnName(“Id”);
Property(e=>e.Createdon)
.HasColumnName(“createdon”)
.HasColumnType(“日期时间”)
.HasDefaultValueSql(“(getdate())”);
Property(e=>e.Goal)
.HasColumnName(“目标”)
.HasMaxLength(100)
.IsUnicode(假);
实体属性(e=>e.Grade)
.HasColumnName(“等级”)
.HasMaxLength(2)
.IsUnicode(假);
entity.Property(e=>e.Subjectid).HasColumnName(“Subjectid”);
entity.HasOne(d=>d.Subject)
.有许多(p=>p.书)
.HasForeignKey(d=>d.Subjectid)
.HasConstraintName(“FK_图书主题”);
});
modelBuilder.Entity(Entity=>
{
Property(e=>e.Id).HasColumnName(“Id”);
Property(e=>e.Createdby).HasColumnName(“Createdby”);
entity.Property(e=>e.Name)
.HasColumnName(“名称”)
.HasMaxLength(50)
.IsUnicode(假);
});
在这里,当我检索书籍时,我想从主题实体中获取主题名称。 不幸的是,我没有可用的EF设计模型(不知道为什么)。
是否可以通过dbcontext实现这一点?

因此书籍和主题之间存在一对多的关系:每本书都有一个主题,即外键SubjectId所指的主题。每一个主题都是零本或多本书的主题

现在您需要书籍的(一些属性),每本书都有它的主题名称,也许还有一些其他的主题属性

如果Book类具有属性
虚拟主题Subject{get;set;}
,则可以使用该属性获取它。实体框架知道一对多关系,并知道如何将其转换为适当的(组)连接

如果类没有此属性,您应该自己执行连接:

使用虚拟财产 请加入你自己 如果你有一对多的关系,你就有一对多。要获取“具有零个或多个子项的项”,请使用
GroupJoin
,要获取“具有外键引用的唯一父项的项”,请使用
Join

var booksWithTheirSubjectNames = dbContext.Books.Join(dbContext.Subjects,

    book => book.SubjectId,     // from every Book take the foreign key
    subject => subject.Id,      // from every Subject take the primary key

    // when they match, take the Book and the Subject to make one new object:
    (book, subject) => new
    {
        Id = book.Id,
        Title = book.Title,
        ...

        Subject = new
        {
             Name = book.Subject.Name,
             Description = book.Subject.Description,
             ...
        },
    });
var booksWithTheirSubjectNames = dbContext.Books

    // only if you don't want all Books
    .Where(book => ...)

    .Select(book => new
    {
        // Select the Book properties that you plan to use:
        Id = book.Id,
        Title = book.Title,
        ...

        // Select the subject properties that you plan to use
        Subject = new
        {
             Name = book.Subject.Name,
             Description = book.Subject.Description,
             ...
        },
    });
var booksWithTheirSubjectNames = dbContext.Books.Join(dbContext.Subjects,

    book => book.SubjectId,     // from every Book take the foreign key
    subject => subject.Id,      // from every Subject take the primary key

    // when they match, take the Book and the Subject to make one new object:
    (book, subject) => new
    {
        Id = book.Id,
        Title = book.Title,
        ...

        Subject = new
        {
             Name = book.Subject.Name,
             Description = book.Subject.Description,
             ...
        },
    });