某些情况下,出于性能考虑,我们需要外键的id值,但不想使用join子句把引用类型都读进来。
class Book
{
public int Id { get; set; }
public string Name { get; set; }
public string Author { get; set; }
public int Age { get; set; }
public Person Owner { get; set; }
public int OwnerId { get; set; } // 引入这个OwnerId, 等于Owner.Id
public override string ToString()
{
return $"name:{Name}, author:{Author}, owner:{Owner.Name}";
}
}
class BookConfig : IEntityTypeConfiguration<Book>
{
public void Configure(EntityTypeBuilder<Book> builder)
{
builder.ToTable("Book");
// nvarchar is changed to varchar, but length is decided by HasMaxLength(50).
builder.Property(e => e.Name).HasColumnType("nvarchar(80)").HasMaxLength(50).IsRequired();
builder.Property(e => e.Author).HasColumnName("author_name").HasMaxLength(100).IsRequired();
builder.Ignore(e => e.Age);
// 使用HasForeignKey()
builder.HasOne<Person>(b => b.Owner).WithMany(p => p.Books).HasForeignKey(b => b.OwnerId).IsRequired();
}
}
private static Task ReadPartial(MyDbContext ctx)
{
// sql becomes: select id, name from book.
var book = ctx.Books.Select(b => new { b.Id, b.Name }).First();
Console.WriteLine(book.Name);
// use ownerId to get Owner's id without join sub clause.
var book2 = ctx.Books.Select(b => new { b.Id, b.Name, b.OwnerId }).FirstOrDefault();
Console.WriteLine(book2.OwnerId);
return Task.CompletedTask;
}
可以看到上述sql语句没有join子句。