1、以订单与物流为示例。
// 配置订单与物流实体和配置文件
// 物流实体
internal class ExpressBill
{
public int ExpressBillId { get; set; }
public string Name { get; set; }
public Order Order { get; set; } // 关联订单
public int ExOrderId { get; set; }
}
// 物流配置文件 一对一配置 HasOne().WithOne() 这个属性可以配置在物流配置文件中,也可以配置在订单配置文件中
internal class ExpressBillConfig : IEntityTypeConfiguration<ExpressBill>
{
public void Configure(EntityTypeBuilder<ExpressBill> builder)
{
builder.ToTable("Buz_ExpressBill");
builder.Property(p => p.Name).IsRequired().HasMaxLength(200);
builder.HasOne(p => p.Order) // 指定当前实体(ExpressBill)与另一个实体(Order)之间的一对一关系
.WithOne(o => o.ExpressBill) // 反向导航属性,指定 Order 实体中的 ExpressBill 属性也是一对一的关系
.HasForeignKey<ExpressBill>(p => p.ExOrderId); // 指定外键字段
//.HasForeignKey<ExpressBill>(p => p.ExOrderId):这一行指定了 ExpressBill 实体中的外键字段 ExOrderId 作为关联关系的外键。p => p.ExOrderId 表示 ExpressBill 实体中的 ExOrderId 字段。<ExpressBill> 是类型参数,它指明了当前配置的是哪个实体类型。
}
}
internal class Order
{
public int OrderId { get; set; }
public string OrderName { get; set; }
public ExpressBill ExpressBill { get; set; }
}
internal class OrderConfig : IEntityTypeConfiguration<Order>
{
public void Configure(EntityTypeBuilder<Order> builder)
{
builder.ToTable("Buz_Order");
builder.Property(p => p.OrderName).IsRequired().HasMaxLength(200);
}
}
// 配置数据库等信息
internal class MyDbContext : DbContext
{
// private static ILoggerFactory loggerFactory = LoggerFactory.Create(p => p.AddConsole()); // 标准日志记录
public DbSet<ExpressBill> ExpressBills { get; set; }
public DbSet<Order> Orders { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
var conStr = "Server=.;Database=Demo3;uid=sa;pwd=sasa;TrustServerCertificate=True;";
optionsBuilder.UseSqlServer(conStr);
// 查看SQL日志方式一、LoptionsBuilder.UseLoggerFactory(loggerFactory);
// 查看日志方式二、
//optionsBuilder.LogTo(sql =>
//{
// if (!sql.Contains("CommandExecuted")) return;
// // Console.WriteLine(sql);
//}); // 简单查询sql日志
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
}
}
static void Main(string[] args)
{
var order1 = new Order { OrderName = "买牛蹄" };
var order2 = new Order { OrderName = "买筋头巴脑" };
var express1 = new ExpressBill { Name = "顺丰快递", Order = order1 };
var express2 = new ExpressBill { Name = "京东快递", Order = order2 };
using (var myDbContext = new MyDbContext())
{
myDbContext.Orders.AddRange(order1, order2);
myDbContext.ExpressBills.AddRange(express1, express2);
myDbContext.SaveChanges();
// 方式三查看SQL日志,用ToQueryString()(不能查询到插入和更新的sql);
var querySql = myDbContext.Orders
.Include(p => p.ExpressBill)
.Where(p => p.OrderName == "买牛蹄")
.ToQueryString();
Console.WriteLine(sql);
}
}