Open
Description
问题描述及重现代码:
Firebird 数据库利用导航属性进行级联保存时报 System.NullReferenceException:
var repo = fsql.GetRepository<TestCategory>();
repo.DbContextOptions.EnableCascadeSave = true;
repo.Insert(list); // System.NullReferenceException
在执行导出导入时发现的问题(数据从某库导出并导入到目标库),目标库是 pgsql/sqlserver/mysql/oracle/dm 等等时均正常,只有 Firebird 导入失败,搞好长时间才发现实体里的日期类型属性加上 [Column(ServerTime = DateTimeKind.Local)]
后插入就报异常,完整重现见下。
using FreeSql.DataAnnotations;
using System.ComponentModel.DataAnnotations;
namespace ConsoleApp3
{
internal class Program
{
static void Main(string[] args)
{
IFreeSql fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.Firebird, "database=localhost/3050:EMPLOYEE.FDB;user=SYSDBA;password=123456")
.UseAutoSyncStructure(true)
.UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)
.UseMonitorCommand(cmd => Console.WriteLine($"-- sql@{DateTime.Now:HH:mm:ss.fff} --\n{cmd.CommandText}\n---------\n"))
.Build();
var list = new List<TestCategory>
{
new TestCategory
{
Name = "c1",
Articles = new List<TestArticle>
{
new TestArticle
{
Title = "t1a",
},
new TestArticle
{
Title = "t1b",
}
}
},
new TestCategory
{
Name = "c2",
Articles = new List<TestArticle>
{
new TestArticle
{
Title = "t2a",
},
new TestArticle
{
Title = "t2b",
}
}
}
};
var repo = fsql.GetRepository<TestCategory>();
repo.DbContextOptions.EnableCascadeSave = true;
repo.Insert(list); // 这里报 System.NullReferenceException
Console.ReadLine();
}
}
[Table(Name = "test_category")]
public class TestCategory
{
[Column(IsPrimary = true, IsIdentity = true)]
public long Id { get; set; }
[Required]
public string Name { get; set; }
[Navigate(nameof(TestArticle.CategoryId))]
public List<TestArticle> Articles { get; set; } = new List<TestArticle>();
}
[Table(Name = "test_article")]
public class TestArticle
{
[Column(IsPrimary = true, IsIdentity = true)]
public long Id { get; set; }
[Required]
public string Title { get; set; }
public long CategoryId { get; set; }
[Navigate(nameof(CategoryId))]
public TestCategory Category { get; set; }
[Column(ServerTime = DateTimeKind.Local)] // 移除此特性就可以成功插入!
public DateTime CreatedTime { get; set; }
}
}
堆栈:
System.NullReferenceException
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=FreeSql
StackTrace:
在 FreeSql.Extensions.EntityUtil.EntityUtilExtensions.MapEntityValue(IFreeSql orm, Type entityType, Object entityFrom, Object entityTo)
在 FreeSql.DbSet`1.AddPriv(TEntity data, Boolean isCheck)
在 FreeSql.DbSet`1.AddRange(IEnumerable`1 data)
在 FreeSql.DbSet`1.<>c__DisplayClass81_0.<AddOrUpdateNavigate>b__0(PropertyInfo prop)
在 FreeSql.DbSet`1.AddOrUpdateNavigate(TEntity item, Boolean isAdd, String propertyName)
在 FreeSql.DbSet`1.AddPriv(TEntity data, Boolean isCheck)
在 FreeSql.DbSet`1.AddRange(IEnumerable`1 data)
在 FreeSql.BaseRepository`1.Insert(IEnumerable`1 entitys)
在 ConsoleApp3.Program.Main(String[] args) 在 E:\QuickAdmin\source\FreeSql\issues\ConsoleApp3\Program.cs 中: 第 53 行
数据库版本
Firebird 5.0
安装的Nuget包
FreeSql.Provider.Firebird/FreeSql.DbContext 3.5.108
更新至 3.5.205 问题依旧
.net framework/. net core? 及具体版本
.net8.0
Metadata
Metadata
Assignees
Labels
No labels