diff --git a/Examples/efcore_to_freesql/Entitys/Song.cs b/Examples/efcore_to_freesql/Entitys/Song.cs new file mode 100644 index 00000000..4ae2ffc7 --- /dev/null +++ b/Examples/efcore_to_freesql/Entitys/Song.cs @@ -0,0 +1,48 @@ +using FreeSql.DataAnnotations; +using System; +using System.Collections.Generic; + +namespace efcore_to_freesql.Entitys +{ + public class SongType + { + public int Id { get; set; } + public string Name { get; set; } + + public List Songs { get; set; } + } + + public class Song + { + [Column(IsIdentity = true)] + public int Id { get; set; } + public string Title { get; set; } + public string Url { get; set; } + public DateTime CreateTime { get; set; } + + public int TypeId { get; set; } + public SongType Type { get; set; } + public List Tags { get; set; } + + public int Field1 { get; set; } + public long RowVersion { get; set; } + } + public class Song_tag + { + public int Song_id { get; set; } + public Song Song { get; set; } + + public int Tag_id { get; set; } + public Tag Tag { get; set; } + } + + public class Tag + { + [Column(IsIdentity = true)] + public int Id { get; set; } + + public string Name { get; set; } + + public List Songs { get; set; } + } +} diff --git a/Examples/efcore_to_freesql/FreeSqlExtensions/CodeFirstExtensions.cs b/Examples/efcore_to_freesql/FreeSqlExtensions/CodeFirstExtensions.cs index 096f5b9f..9dcf1145 100644 --- a/Examples/efcore_to_freesql/FreeSqlExtensions/CodeFirstExtensions.cs +++ b/Examples/efcore_to_freesql/FreeSqlExtensions/CodeFirstExtensions.cs @@ -1,4 +1,5 @@ -using FreeSql; +using efcore_to_freesql.Entitys; +using FreeSql; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata; using System; @@ -69,4 +70,112 @@ public static class CodeFirstExtensions }); } } + + public static void EfCoreFluentApiTestGeneric(this ICodeFirst cf) + { + cf.Entity(eb => + { + eb.ToTable("tb_song1"); + eb.Ignore(a => a.Field1); + eb.Property(a => a.Title).HasColumnType("varchar(50)").IsRequired(); + eb.Property(a => a.Url).HasMaxLength(100); + + eb.Property(a => a.RowVersion).IsRowVersion(); + eb.Property(a => a.CreateTime).HasDefaultValueSql("current_timestamp"); + + eb.HasKey(a => a.Id); + eb.HasIndex(a => a.Title).IsUnique().HasName("idx_tb_song1111"); + + //一对多、多对一 + eb.HasOne(a => a.Type).HasForeignKey(a => a.TypeId).WithMany(a => a.Songs); + + //多对多 + eb.HasMany(a => a.Tags).WithMany(a => a.Songs, typeof(Song_tag)); + }); + cf.Entity(eb => + { + eb.ToTable("tb_songtype1"); + eb.HasMany(a => a.Songs).WithOne(a => a.Type).HasForeignKey(a => a.TypeId); + + eb.HasData(new[] + { + new SongType + { + Id = 1, + Name = "流行", + Songs = new List(new[] + { + new Song{ Title = "真的爱你" }, + new Song{ Title = "爱你一万年" }, + }) + }, + new SongType + { + Id = 2, + Name = "乡村", + Songs = new List(new[] + { + new Song{ Title = "乡里乡亲" }, + }) + }, + }); + }); + + cf.SyncStructure(); + cf.SyncStructure(); + } + + public static void EfCoreFluentApiTestDynamic(this ICodeFirst cf) + { + cf.Entity(typeof(Song), eb => + { + eb.ToTable("tb_song2"); + eb.Ignore("Field1"); + eb.Property("Title").HasColumnType("varchar(50)").IsRequired(); + eb.Property("Url").HasMaxLength(100); + + eb.Property("RowVersion").IsRowVersion(); + eb.Property("CreateTime").HasDefaultValueSql("current_timestamp"); + + eb.HasKey("Id"); + eb.HasIndex("Title").IsUnique().HasName("idx_tb_song2222"); + + //一对多、多对一 + eb.HasOne("Type").HasForeignKey("TypeId").WithMany("Songs"); + + //多对多 + eb.HasMany("Tags").WithMany("Songs", typeof(Song_tag)); + }); + cf.Entity(typeof(SongType), eb => + { + eb.ToTable("tb_songtype2"); + eb.HasMany("Songs").WithOne("Type").HasForeignKey("TypeId"); + + eb.HasData(new[] + { + new SongType + { + Id = 1, + Name = "流行", + Songs = new List(new[] + { + new Song{ Title = "真的爱你" }, + new Song{ Title = "爱你一万年" }, + }) + }, + new SongType + { + Id = 2, + Name = "乡村", + Songs = new List(new[] + { + new Song{ Title = "乡里乡亲" }, + }) + }, + }); + }); + + cf.SyncStructure(); + cf.SyncStructure(); + } } \ No newline at end of file diff --git a/Examples/efcore_to_freesql/Startup.cs b/Examples/efcore_to_freesql/Startup.cs index 0245f0c9..3debf0b1 100644 --- a/Examples/efcore_to_freesql/Startup.cs +++ b/Examples/efcore_to_freesql/Startup.cs @@ -27,10 +27,10 @@ namespace efcore_to_freesql .UseAutoSyncStructure(true) .Build(); - //FreeSqlDbContextExtensions.EfCoreFluentApiTestGeneric(Fsql); - FreeSqlDbContextExtensions.EfCoreFluentApiTestDynamic(Fsql); + //Fsql.CodeFirst.EfCoreFluentApiTestGeneric(); + Fsql.CodeFirst.EfCoreFluentApiTestDynamic(); - DBContexts.BaseDBContext.Fsql = Fsql; + BaseDBContext.Fsql = Fsql; var sql11 = Fsql.Select().ToSql(); //SELECT a."Id", a."Title", a."CreateTime" FROM "Topic1" a diff --git a/FreeSql.DbContext/EfCoreFluentApi/EfCoreFluentApiExtensions.cs b/FreeSql.DbContext/EfCoreFluentApi/EfCoreFluentApiExtensions.cs index e31ac3fe..f6974811 100644 --- a/FreeSql.DbContext/EfCoreFluentApi/EfCoreFluentApiExtensions.cs +++ b/FreeSql.DbContext/EfCoreFluentApi/EfCoreFluentApiExtensions.cs @@ -34,156 +34,4 @@ partial class FreeSqlDbContextExtensions codeFirst.ConfigEntity(entityType, tf => modelBuilder(new EfCoreTableFluent(cf._orm, tf, entityType))); return codeFirst; } - - public static void EfCoreFluentApiTestGeneric(IFreeSql fsql) - { - var cf = fsql.CodeFirst; - cf.Entity(eb => - { - eb.ToTable("tb_song1"); - eb.Ignore(a => a.Field1); - eb.Property(a => a.Title).HasColumnType("varchar(50)").IsRequired(); - eb.Property(a => a.Url).HasMaxLength(100); - - eb.Property(a => a.RowVersion).IsRowVersion(); - eb.Property(a => a.CreateTime).HasDefaultValueSql("current_timestamp"); - - eb.HasKey(a => a.Id); - eb.HasIndex(a => a.Title).IsUnique().HasName("idx_tb_song1111"); - - //一对多、多对一 - eb.HasOne(a => a.Type).HasForeignKey(a => a.TypeId).WithMany(a => a.Songs); - - //多对多 - eb.HasMany(a => a.Tags).WithMany(a => a.Songs, typeof(Song_tag)); - }); - cf.Entity(eb => - { - eb.ToTable("tb_songtype1"); - eb.HasMany(a => a.Songs).WithOne(a => a.Type).HasForeignKey(a => a.TypeId); - - eb.HasData(new[] - { - new SongType - { - Id = 1, - Name = "流行", - Songs = new List(new[] - { - new Song{ Title = "真的爱你" }, - new Song{ Title = "爱你一万年" }, - }) - }, - new SongType - { - Id = 2, - Name = "乡村", - Songs = new List(new[] - { - new Song{ Title = "乡里乡亲" }, - }) - }, - }); - }); - - cf.SyncStructure(); - cf.SyncStructure(); - } - - public static void EfCoreFluentApiTestDynamic(IFreeSql fsql) - { - var cf = fsql.CodeFirst; - cf.Entity(typeof(Song), eb => - { - eb.ToTable("tb_song2"); - eb.Ignore("Field1"); - eb.Property("Title").HasColumnType("varchar(50)").IsRequired(); - eb.Property("Url").HasMaxLength(100); - - eb.Property("RowVersion").IsRowVersion(); - eb.Property("CreateTime").HasDefaultValueSql("current_timestamp"); - - eb.HasKey("Id"); - eb.HasIndex("Title").IsUnique().HasName("idx_tb_song2222"); - - //一对多、多对一 - eb.HasOne("Type").HasForeignKey("TypeId").WithMany("Songs"); - - //多对多 - eb.HasMany("Tags").WithMany("Songs", typeof(Song_tag)); - }); - cf.Entity(typeof(SongType), eb => - { - eb.ToTable("tb_songtype2"); - eb.HasMany("Songs").WithOne("Type").HasForeignKey("TypeId"); - - eb.HasData(new[] - { - new SongType - { - Id = 1, - Name = "流行", - Songs = new List(new[] - { - new Song{ Title = "真的爱你" }, - new Song{ Title = "爱你一万年" }, - }) - }, - new SongType - { - Id = 2, - Name = "乡村", - Songs = new List(new[] - { - new Song{ Title = "乡里乡亲" }, - }) - }, - }); - }); - - cf.SyncStructure(); - cf.SyncStructure(); - } - - public class SongType - { - public int Id { get; set; } - public string Name { get; set; } - - public List Songs { get; set; } - } - - public class Song - { - [Column(IsIdentity = true)] - public int Id { get; set; } - public string Title { get; set; } - public string Url { get; set; } - public DateTime CreateTime { get; set; } - - public int TypeId { get; set; } - public SongType Type { get; set; } - public List Tags { get; set; } - - public int Field1 { get; set; } - public long RowVersion { get; set; } - } - public class Song_tag - { - public int Song_id { get; set; } - public Song Song { get; set; } - - public int Tag_id { get; set; } - public Tag Tag { get; set; } - } - - public class Tag - { - [Column(IsIdentity = true)] - public int Id { get; set; } - - public string Name { get; set; } - - public List Songs { get; set; } - } } diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 9c6cd88b..743835e4 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -532,5 +532,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.DbContext/TempExtensions.cs b/FreeSql.DbContext/TempExtensions.cs deleted file mode 100644 index 43528138..00000000 --- a/FreeSql.DbContext/TempExtensions.cs +++ /dev/null @@ -1,7 +0,0 @@ - -namespace FreeSql.Extensions.EntityUtil -{ - public static class TempExtensions - { - } -} diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 030132d4..fd1680d0 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -2983,153 +2983,6 @@ - - - 测试数据库是否连接正确,本方法执行如下命令: - MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1 - Oracle: SELECT 1 FROM dual - - true: 成功, false: 失败 - - - - 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 - - - - - - - - - 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > ?age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - 查询 - - - - - - - 查询,ExecuteArrayAsync("select * from user where age > ?age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 查询 - - - - - - - 查询,ExecuteDataSetAsync("select * from user where age > ?age; select 2", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 查询 - - - - - - - 查询,ExecuteDataTableAsync("select * from user where age > ?age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 在【主库】执行 - - - - - - - - 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > ?age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 在【主库】执行 - - - - - - - - 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > ?age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > ?age", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > ?age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 执行SQL返回对象集合,Query<User>("select * from user where age > ?age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - 执行SQL返回对象集合,Query<User, Address>("select * from user where age > ?age; select * from address", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - 可自定义解析表达式 @@ -3886,12 +3739,6 @@ 超时 - - - 获取资源 - - - 使用完毕后,归还资源 @@ -3962,12 +3809,6 @@ 资源对象 - - - 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 - - 资源对象 - 归还对象给对象池的时候触发