dotnetcore / dotnetcore/FreeSql

Firebird 数据库级联保存报 NullReferenceException 异常

Open
#2,023 6 comments 0 reactions 0 assignees View on GitHub
Dominant language
C#
Stars
4.4k
Forks
910
PR merge metrics
No merged PRs in 30d

Description

#### 问题描述及重现代码:

Firebird 数据库利用导航属性进行级联保存时报 System.NullReferenceException:
```c#
var repo = fsql.GetRepository();
repo.DbContextOptions.EnableCascadeSave = true;
repo.Insert(list); // System.NullReferenceException
```
在执行导出导入时发现的问题(数据从某库导出并导入到目标库),目标库是 pgsql/sqlserver/mysql/oracle/dm 等等时均正常,只有 Firebird 导入失败,搞好长时间才发现实体里的日期类型属性加上 ``[Column(ServerTime = DateTimeKind.Local)]`` 后插入就报异常,完整重现见下。
```c#
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
{
new TestCategory
{
Name = "c1",
Articles = new List
{
new TestArticle
{
Title = "t1a",
},
new TestArticle
{
Title = "t1b",
}
}
},
new TestCategory
{
Name = "c2",
Articles = new List
{
new TestArticle
{
Title = "t2a",
},
new TestArticle
{
Title = "t2b",
}
}
}
};

var repo = fsql.GetRepository();
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 Articles { get; set; } = new List();
}

[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.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

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.