Skip to content

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

Open
@ecocom

Description

@ecocom

问题描述及重现代码:

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions