sqlite 为什么我在尝试更新带有后备字段的记录时会看到“没有定义强制运算符”异常?

h6my8fg2  于 2022-11-14  发布在  SQLite
关注(0)|答案(1)|浏览(123)

我可能不完全了解EF Core中的支持字段是如何工作的,但我很惊讶地发现,当我试图保存记录时会出现这个异常--而且我还找不到任何有关它的信息。我使用的是关闭了更改跟踪的C#9记录。这是在具有实体框架核心和SQLite数据库的ASP.NET核心Web API的上下文中进行的。以下是一些再现错误的简化数据模型:

public record Parent(string Info)
{
    //Backing field
    private List<Child> children = new();

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; init; } = 0;
    public ImmutableList<Child> Children 
    { 
        get => children.ToImmutableList(); 
        init => children = value.ToList(); 
    }
}
public record Child(string Info)
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; init; } = 0;
}

数据库上下文:

public class TestContext : DbContext
{
    public TestContext(DbContextOptions<TestContext> options) : base(options)
        { }

    public DbSet<Parent> Parents { get; set; }
    public DbSet<Child> Children { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Parent>().HasMany(
            parent => parent.Children).WithOne();
    }
}

一个小控制器,我尝试在其中将新的父级保存到数据库中:

[ApiController]
[Route("[controller]")]
public class ParentController : Controller
{
    private readonly TestContext _context;

    public ParentController(TestContext context) => _context = context;

    [HttpPost]
    public ActionResult Create()
    {
    //Exception thrown:    
    _context.Parents.Add(new("First")
        {
            Children = new List<Child>
            {
                new("First"),
                new("Second"),
                new("Third")
            }.ToImmutableList()
        });
        _context.SaveChanges();
        return Ok();
    }
    [HttpGet]
    public ActionResult<IEnumerable<Parent>> Get()
        => _context.Parents.Include(
            parent => parent.Children).ToList();
}

引发的异常:

System.InvalidOperationException: 'No coercion operator is defined between types 'System.Collections.Generic.List`1[TestAPI.Models.Child]' and 'System.Collections.Immutable.ImmutableList`1[TestAPI.Models.Child]'.'

这里的幕后发生了什么?我怎么才能绕过这个问题呢?

kmynzznz

kmynzznz1#

我试了一下,如下

public List<Child> ChildLsit => Children.ToList();

        [NotMapped]
        public ImmutableList<Child> Children
        {
            get => children.ToImmutableList();
            init => children = value.ToList();
        }

这一次,它不会得到您所显示的错误,在我看来,如果您确实想要将属性设置为ImmuableList,您可以创建一个DTO/ViewModel并将相应的属性设置为ImmuableList,然后将其Map到您的实体

相关问题