建2个表, 导入到数据库中
在EFCore中配置 先不配置外键
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SelectDemon
{
public class Model1
{
public int Id { get; set; }
public string Name { get; set; }
public int Number { get; set; }
//public Model2 Model2 { get; set; } //没有对应外键时候注释掉
public int Model2Id { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SelectDemon
{
public class Model2
{
public int Id { get; set; }
public string OtherInfo { get; set; }
public int Number { get; set; }
//public List<Model1> Model1s { get; set; } //没有对应外键时候注释掉
}
}
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SelectDemon
{
//多
public class Model1Config : IEntityTypeConfiguration<Model1>
{
public void Configure(EntityTypeBuilder<Model1> builder)
{
builder.ToTable("Model1");
builder.HasKey(x => x.Id);
//一对一
//builder.HasOne<Model2>(m=>m.Model2).WithOne(a=>a.Model1).HasForeignKey<Model1>(m=>m.Model2Id);
//一对多 没有外键时注释掉
//builder.HasOne<Model2>(m => m.Model2).WithMany(a => a.Model1s).HasForeignKey(m => m.Model2Id);
}
}
}
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SelectDemon
{
public class MyDbContext : DbContext
{
public DbSet<Model1> Model1s { get; set; }
public DbSet<Model2> Model2s { get; set; }
private ConfigurationBuilder cfgBuilder = new ConfigurationBuilder();
IConfiguration configRoot;
string connString;
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
cfgBuilder.AddJsonFile("Config.json", optional: true, reloadOnChange: true);
configRoot = cfgBuilder.Build();
connString = configRoot.GetSection("ConnectionStrings:SqliteConnectionString").Value;
optionsBuilder.UseSqlite(connString);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
}
}
}
建立表1对表2的外键:
//Console.WriteLine("Hello, World!");
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using SelectDemon;
using (MyDbContext db = new MyDbContext())
{
//m1 为list, 外键在m1中, 外键为m2的Id:Model2Id.
//如果二者有相同的number值, m1中的Model2Id 等于Model2的ID
var m1 = db.Model1s; //多
var m3 = db.Model2s;//一
Dictionary<int, int> t1 = new Dictionary<int, int>();
foreach (var item in m3)
{
t1.Add(item.Number,item.Id);
}
foreach (var item in m1)
{
if (t1.ContainsKey(item.Number))
{
item.Model2Id = t1[item.Number];
}
}
db.SaveChanges();
}
之后把外键加上
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SelectDemon
{
public class Model1
{
public int Id { get; set; }
public string Name { get; set; }
public int Number { get; set; }
public Model2 Model2 { get; set; } //没有对应外键时候注释掉
public int Model2Id { get; set; }
}
}
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SelectDemon
{
//多
public class Model1Config : IEntityTypeConfiguration<Model1>
{
public void Configure(EntityTypeBuilder<Model1> builder)
{
builder.ToTable("Model1");
builder.HasKey(x => x.Id);
//一对一
//builder.HasOne<Model2>(m=>m.Model2).WithOne(a=>a.Model1).HasForeignKey<Model1>(m=>m.Model2Id);
//一对多 没有外键时注释掉
builder.HasOne<Model2>(m => m.Model2).WithMany(a => a.Model1s).HasForeignKey(m => m.Model2Id);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SelectDemon
{
public class Model2
{
public int Id { get; set; }
public string OtherInfo { get; set; }
public int Number { get; set; }
public List<Model1> Model1s { get; set; } //没有对应外键时候注释掉
}
}
然后数据迁移即可
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="6.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="6.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Options" Version="6.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="NModbus4.NetCore" Version="2.0.1" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="6.0.1" />
</ItemGroup>
<ItemGroup>
<None Update="Config.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>