-
Notifications
You must be signed in to change notification settings - Fork 856
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
建议能结合EF Core的一些特性来弄 #4
Comments
意见收到,现在过年期间,年后向您请教 |
有新的进展了吗? |
using FreeSql.DataAnnotations;
using Xunit;
namespace FreeSql.Tests.DataAnnotations {
public class g {
public static IFreeSql mysql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10")
.UseAutoSyncStructure(true)
.UseMonitorCommand(
cmd => {
Trace.WriteLine(cmd.CommandText);
}, //监听SQL命令对象,在执行前
(cmd, traceLog) => {
Console.WriteLine(traceLog);
}) //监听SQL命令对象,在执行后
.UseLazyLoading(true)
.Build();
}
public class FluentTest {
[Fact]
public void Fluent() {
g.mysql.CodeFirst
.ConfigEntity<TestFluenttb1>(a => {
a.Name("xxdkdkdk1").SelectFilter("a.Id22 > 0");
a.Property(b => b.Id).Name("Id22").IsIdentity(true);
a.Property(b => b.name).DbType("varchar(100)").IsNullable(true);
})
.ConfigEntity<TestFluenttb2>(a => {
a.Name("xxdkdkdk2").SelectFilter("a.Idx > 0");
a.Property(b => b.Id).Name("Id22").IsIdentity(true);
a.Property(b => b.name).DbType("varchar(100)").IsNullable(true);
});
var ddl1 = g.mysql.CodeFirst.GetComparisonDDLStatements<TestFluenttb1>();
var ddl2 = g.mysql.CodeFirst.GetComparisonDDLStatements<TestFluenttb2>();
var t1id = g.mysql.Insert<TestFluenttb1>().AppendData(new TestFluenttb1 { }).ExecuteIdentity();
var t1 = g.mysql.Select<TestFluenttb1>(t1id).ToOne();
var t2lastId = g.mysql.Select<TestFluenttb2>().Max(a => a.Id);
var t2affrows = g.mysql.Insert<TestFluenttb2>().AppendData(new TestFluenttb2 { Id = t2lastId + 1 }).ExecuteAffrows();
var t2 = g.mysql.Select<TestFluenttb2>(t2lastId + 1).ToOne();
}
}
class TestFluenttb1 {
public int Id { get; set; }
public string name { get; set; } = "defaultValue";
}
[Table(Name = "cccccdddwww")]
class TestFluenttb2 {
[Column(Name = "Idx", IsPrimary = true, IsIdentity = false)]
public int Id { get; set; }
public string name { get; set; } = "defaultValue";
}
} 这是测试代码,目前已经发布了 |
`/// /// 映射表 /// protected override void MapTable( EntityTypeBuilder builder ) { builder.ToTable( "auth" ); }
|
目前设定方法名和Attribute是一样的,看上去比较尬,哈哈 |
有办法改进支持一下吗?我想将你的这个框架和我们现在的系统结合起来用 |
具体你可以看一下Util这个开源项目 |
是的,因为目前实体没法共用,会提示找不到字段 |
可否方便发一些实体+map demo 作参考 |
我们这主要也就是主键Id字段的名字会不一样。你可以直接在Util的Demo基础上实现功能就能满足需求了。 |
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
namespace FreeSql.Extensions.EFCoreModelBuilder {
public static class CodeFirstExtensions {
public static void ConfigEntity(this ICodeFirst codeFirst, ModelBuilder modelBuilder) {
foreach (var type in modelBuilder.Model.GetEntityTypes()) {
codeFirst.ConfigEntity(type.ClrType, a => {
//表名
var relationalTableName = type.FindAnnotation("Relational:TableName");
if (relationalTableName != null) {
a.Name(relationalTableName.Value?.ToString() ?? type.ClrType.Name);
}
foreach (var prop in type.GetProperties()) {
var freeProp = a.Property(prop.Name);
//列名
var relationalColumnName = prop.FindAnnotation("Relational:ColumnName");
if (relationalColumnName != null) {
freeProp.Name(relationalColumnName.Value?.ToString() ?? prop.Name);
}
//主键
freeProp.IsPrimary(prop.IsPrimaryKey());
//自增
freeProp.IsIdentity(prop.GetAnnotations().Where(z =>
z.Name == "SqlServer:ValueGenerationStrategy" && z.Value.ToString().Contains("IdentityColumn") //sqlserver 自增
).Any());
//可空
freeProp.IsNullable(prop.AfterSaveBehavior != Microsoft.EntityFrameworkCore.Metadata.PropertySaveBehavior.Throw);
//类型
var relationalColumnType = prop.FindAnnotation("Relational:ColumnType");
if (relationalColumnType != null) {
var dbType = relationalColumnType.ToString();
if (!string.IsNullOrEmpty(dbType)) {
var maxLength = prop.FindAnnotation("MaxLength");
if (maxLength != null)
dbType += $"({maxLength})";
freeProp.DbType(dbType);
}
}
}
});
}
}
}
} 你先看看这段代码。使用的是扩展方法,意图将 EF ModelBuilder 对象直接配置为 FreeSql 的实体。 更新日志: 代码: |
- 增加 FreeSql.Extensions.EFCoreModelBuilder 扩展库,现实与 EFCore 实体共存; - 增加 FreeSql.RESTful.Demo 示例项目;
https://www.cnblogs.com/kellynic/p/10384165.html |
我看看 |
还需要针对每个实体来做下面这种配置吗? fsql.CodeFirst |
不需要啊,在Ef fuentapi 或onmodelcreating 配置 |
有没有具体的Demo? |
v0.0.14
示例请见源码: 在 Startup.cs 测试的,请看注释执行的SQL语句。如果EF实体配置过映射,在执行任意EF操作后将配置同步至FreeSql中。 |
所有 EFCore DBContext 继承 BaseDBContext public class BaseDBContext : DbContext {
public static IFreeSql Fsql { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
Fsql.CodeFirst.ConfigEntity(modelBuilder.Model); //同步配置
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
optionsBuilder.UseSqlite(@"Data Source=|DataDirectory|\document.db;Pooling=true;Max Pool Size=10");
}
} |
和Util的一起使用有冲突,会导致原本的不可用。 |
方便发个冲突小demo我的邮箱吗,[email protected] |
晚点我发个Demo给你看一下。 |
你可以试一下那些表名或者字段名带下划线的,一起使用的时候会导致映射的表名下拉线没有了,感觉好像没有起作用一样的。 |
这样直接用肯定没问题,你结合一下util使用试试。 |
整个可运行的demo呀,我不知道util的使用习惯。 |
我看了一下你的Demo,需要在Startup里配置一次数据库链接,也还需要在BaseDBContext里配置一次链接吗? |
只要配置一次就行,要么starup,或者basedbcontext那里 |
看一下QQ |
能不能弄个单独只是基于basedbcontext的demo,我看了一下你的案例更多的是基于startup的 |
- 增加 ColumnAttribute 属性 InsertValueSql,插入数据的时候指定用 sql 值;
比如能识别下面的映射表及映射主键Id
` ///
/// 映射表
///
protected override void MapTable( EntityTypeBuilder builder ) {
builder.ToTable( "cg_kssqbs" );
}
The text was updated successfully, but these errors were encountered: