EF Core 关系配置

发布时间 2023-11-06 19:52:50作者: LiXiang98

一、一对多

public class Article
{
    public long Id { get; set; }//主键
    public string Title { get; set; }//标题
    public string Content { get; set; }//内容
    public List<Comment> Comments { get; set; } = new List<Comment>(); //此文章的若干条评论
}
public class Comment
{
    public long Id { get; set; }
    public Article Article { get; set; }//导航属性
    public long ArticleId { get; set; }// 声明ArticleId是考虑到有时候不连表查询且需要查询ArticleId
    public string Message { get; set; }
}

  1、配置

class ArticleConfig : IEntityTypeConfiguration<Article>
{
    public void Configure(EntityTypeBuilder<Article> builder)
    {
        builder.ToTable("T_Articles");
        builder.Property(a => a.Content).IsRequired().IsUnicode();
        builder.Property(a => a.Title).IsRequired().IsUnicode().HasMaxLength(255);
    }
}

  

class CommentConfig : IEntityTypeConfiguration<Comment>
{
    public void Configure(EntityTypeBuilder<Comment> builder)
    {
        builder.ToTable("T_Comments");
        builder.HasOne<Article>(c => c.Article).WithMany(a => a.Comments)//这里使用的双向导航属性。如何使用单向导航属性:HasOne<Article>(t=>t.Article).WithMany()
            .IsRequired().HasForeignKey(c => c.ArticleId);//不指定HasForeighKey,数据库中会生成两个ArticleId
        builder.Property(c => c.Message).IsRequired().IsUnicode();
    }
}

 

  2、数据插入

using MyDbContext ctx = ew MyDbContext();

Article a1 = new Article();
a1.Title="TESIJTISJIOT";
a1.Content="jsdfiiiiiiiiiiiiiiiiiiiiiiiCONTiejwqitoniosjfiosadnvocijiotads----";

Comment c1 = new Comment{Message="niubi"};
Comment c2 = new Comment{Message="tailnisjfis"}

a1.Comments.Add(c1);
a1.Comments.Add(c2);

ctx.Articles.Add(a1);
ctx.SaveChanges();

  3、数据获取

using MyDbContext ctx = new MyDbContext();
Airticle a= ctx.Articles.Include(a-=>a.Comments).Single(a=>a.ID==1);
Console.WriteLine(a.Title);
foreach(Comment c in a.Comments) { Console.WriteLine(c.Id + ":" + c.Message); }
using MyDbContext ctx = new MyDbContext();
var cs= ctx.Comments.Include(a-=>a.Airticle).Where(a=>a.AirticleId==1).ToList();

foreach(Comment c in cs)
{
    Console.WriteLine(c.Airticle.Title);
    Console.WriteLine(c.Id + ":" + c.Message);
 }  

 二、一对一

class Delivery
{
    public long Id { get; set; }
    public string CompanyName { get; set; }//快递公司名
    public String Number { get; set; }//快递单号
    public Order Order { get; set; }//订单
    public long OrderId { get; set; }//指向订单的外键
}

class Order
{
    public long Id { get; set; }
    public string Name { get; set; }//商品名
    public string Address { get; set; }//收货地址
    public Delivery? Delivery { get; set; }//快递信息
}

  1、配置

class DeliveryConfig : IEntityTypeConfiguration<Delivery>
{
    public void Configure(EntityTypeBuilder<Delivery> builder)
    {
        builder.ToTable("T_Deliveries");
        builder.Property(d => d.CompanyName).IsUnicode().HasMaxLength(10);
        builder.Property(d => d.Number).HasMaxLength(50);
    }
}
class OrderConfig : IEntityTypeConfiguration<Order>
{
    public void Configure(EntityTypeBuilder<Order> builder)
    {
        builder.ToTable("T_Orders");
        builder.Property(o => o.Address).IsUnicode();
        builder.Property(o => o.Name).IsUnicode();
        builder.HasOne<Delivery>(o => o.Delivery).WithOne(d => d.Order)
            .HasForeignKey<Delivery>(d => d.OrderId);
    }
}

  2、数据插入

using TestDbContext ctx = new TestDbContext();
Order order = new Order();
order.Address = "北京市海淀区中关村南大街999号";
order.Name = "USB充电器";
Delivery delivery = new Delivery();
delivery.CompanyName = "蜗牛快递";
delivery.Number = "SN333322888";
delivery.Order = order;
ctx.Deliveries.Add(delivery);
await ctx.SaveChangesAsync();

  3、数据获取

Order order1 = await ctx.Orders.Include(o => o.Delivery)
    .FirstAsync(o => o.Name.Contains("充电器"));
Console.WriteLine($"名称:{order1.Name},单号:{order1.Delivery.Number}");

三、多对多

class Student
{
    public long Id { get; set; }
    public string Name { get; set; }
    public List<Teacher> Teachers { get; set; } = new List<Teacher>();
}

class Teacher
{
    public long Id { get; set; }
    public string Name { get; set; }
    public List<Student> Students { get; set; } = new List<Student>();
}

  1、配置

class StudentConfig : IEntityTypeConfiguration<Student>
{
    public void Configure(EntityTypeBuilder<Student> builder)
    {
        builder.ToTable("T_Students");
        builder.Property(s => s.Name).IsUnicode().HasMaxLength(20);
        builder.HasMany<Teacher>(s => s.Teachers).WithMany(t => t.Students)
            .UsingEntity(j => j.ToTable("T_Students_Teachers"));
    }
}

class TeacherConfig : IEntityTypeConfiguration<Teacher>
{
    public void Configure(EntityTypeBuilder<Teacher> builder)
    {
        builder.ToTable("T_Teachers");
        builder.Property(s => s.Name).IsUnicode().HasMaxLength(20);
    }
}

  2、数据插入

Student s1 = new Student { Name = "tom" };
Student s2 = new Student { Name = "lily" };
Student s3 = new Student { Name = "lucy" };
Student s4 = new Student { Name = "tim" };
Student s5 = new Student { Name = "lina" };
Teacher t1 = new Teacher { Name = "杨中科" };
Teacher t2 = new Teacher { Name = "罗翔" };
Teacher t3 = new Teacher { Name = "刘晓艳" };
t1.Students.Add(s1);
t1.Students.Add(s2);
t1.Students.Add(s3);
t2.Students.Add(s1);
t2.Students.Add(s3);
t2.Students.Add(s5);
t3.Students.Add(s2);
t3.Students.Add(s4);
using TestDbContext ctx = new TestDbContext();
ctx.AddRange(t1, t2, t3);
ctx.AddRange(s1, s2, s3, s4, s5);
await ctx.SaveChangesAsync();

  3、数据获取

using TestDbContext ctx = new TestDbContext();
foreach (var t in ctx.Teachers.Include(t => t.Students))
{
    Console.WriteLine($"老师{t.Name}");
    foreach (var s in t.Students)
    {
        Console.WriteLine($"---{s.Name}");
    }
}

Part3-21:EF Core多对多_哔哩哔哩_bilibili