我可能不完全了解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]'.'
这里的幕后发生了什么?我怎么才能绕过这个问题呢?
1条答案
按热度按时间kmynzznz1#
我试了一下,如下
这一次,它不会得到您所显示的错误,在我看来,如果您确实想要将属性设置为ImmuableList,您可以创建一个DTO/ViewModel并将相应的属性设置为ImmuableList,然后将其Map到您的实体