Cập nhật (EF Core 3.x):
Vẫn không có cách công khai nào để lấy EntityTypeBuilder
, nhưng ít nhất đối số của hàm tạo đã được sửa đổi thành IMutableEntityType
loại, vì vậy chỉ
using Microsoft.EntityFrameworkCore.Metadata.Builders;
là cần thiết và mã tương ứng bây giờ là
var entityTypeBuilder = new EntityTypeBuilder(entityType);
Bản gốc (EF Core 2.x):
Vấn đề là ClrType
không đủ để xác định loại thực thể được sở hữu, do đó modelBuilder.Entity(Type)
không thể được sử dụng để lấy EntityTypeBuilder
phiên bản cần thiết để cấu hình thành thạo các thuộc tính thực thể.
Có vẻ như không có công khai cách thực hiện điều đó trong EF Core 2.x, vì vậy tất cả những gì tôi có thể đề xuất là sử dụng một số nội bộ của EF Core (may mắn là có thể truy cập công khai theo cảnh báo sử dụng nội bộ điển hình).
Bạn cần using
s:
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
Đầu tiên là cho EntityTypeBuilder
lớp, thứ hai dành cho AsEntityType()
phương thức mở rộng cung cấp cho bạn quyền truy cập vào lớp nội bộ triển khai IEntityType
và đặc biệt là Builder
tài sản.
Mã đã sửa đổi trông giống như sau:
var entityTypes = modelBuilder.Model.GetEntityTypes()
.ToList();
foreach (var entityType in entityTypes)
{
var properties = entityType
.GetProperties()
.ToList();
// (1)
var entityTypeBuilder = new EntityTypeBuilder(entityType.AsEntityType().Builder);
foreach (var property in properties)
{
if (property.PropertyInfo == null)
{
continue;
}
if (property.PropertyInfo.PropertyType.IsBoolean())
{
entityTypeBuilder // (2)
.Property(property.Name)
.HasConversion(new BoolToZeroOneConverter<short>())
.HasColumnType("tinyint(1)");
}
}
}