EF Core 9.HasConversion

问题描述 投票:0回答:1

我正在尝试在我正在开发的一个新项目中遵循 DDD,但在配置我的 ValueObject 之一时遇到了问题。

我有以下AggregateRoot

public sealed class Event : TenantOwnedEntity<EventId>
{
    ... removed for clarity ...

    private Event(EventId id,
        TenantId tenantId,
        EventName name,
        EventDescription description,
        DateOnly startDate,
        DateOnly? endDate,
        EventCost cost,
        EventAttendiesType attendiesType)
        : base(id, tenantId)
    {
        Name = name;
        Description = description;
        StartDate = startDate;
        EndDate = endDate;        
        Cost = cost;
        AttendeesType = attendiesType;
    }

    public EventName Name { get; private set; }

    public EventDescription Description { get; private set; }

    public DateOnly StartDate { get; private set; }

    public DateOnly? EndDate { get; private set; }

    public EventCost Cost { get; private set; }

    public EventAttendiesType AttendeesType { get; private set; }

    ... removed for clarity ...
    
}

具有以下配置

internal class EventConfiguration : IEntityTypeConfiguration<Event>
{
    
    public void Configure(EntityTypeBuilder<Event> builder)
    {
        builder.HasKey(e => e.Id);

        builder
            .Property(e => e.Id)
            .HasConversion
            (
                id => id.Id,
                value => new EventId(value)
            );

        builder.HasIndex(e => e.TenantId);

        builder
            .Property(e => e.Name)
            .HasConversion
            (
                name => name.Value,
                value => EventName.Create(value).Value
            )
            .HasColumnType($"varchar({EventName.MAX_LENGTH})")
            .HasMaxLength(EventName.MAX_LENGTH);

        builder
            .Property(e => e.Description)
            .HasConversion
            (
                description => description.Value,
                value => EventDescription.Create(value).Value
            )
            .HasColumnType($"varchar({EventDescription.MAX_LENGTH})")
            .HasMaxLength(EventDescription.MAX_LENGTH);

        builder
            .Property(e => e.Cost)
            .HasConversion
            (
                cost => EventCostToDb(cost),
                value => EventCostFromDb(value)
            )
            .HasColumnType("varchar(50)")
            .HasMaxLength(50);

        builder
            .Property(e => e.AttendeesType)
            .HasConversion
            (
                attendeeType => AttendeeTypeToDb(attendeeType),
                value => AttendeeTypeFromDb(value)
            )
            .HasColumnType("varchar(50)")
            .HasMaxLength(50);
    }

我遇到的问题是,当我尝试创建迁移 EF core 9 时会抛出以下错误。

无法创建“AppContext”类型的“DbContext”。异常“找不到实体类型“事件”的合适构造函数。以下构造函数的参数无法绑定到实体类型的属性: 无法在“事件(EventId id、TenantIdtenantId、EventName 名称、EventDescription 描述、DateOnly startDate、DateOnly? endDate、EventCost 成本、EventAttendiesType attendiesType)”中绑定“attendiesType” 请注意,只有映射的属性可以绑定到构造函数参数。无法绑定对相关实体的导航,包括对所拥有类型的引用。尝试创建实例时抛出。有关设计时支持的不同模式,请参阅 https://go.microsoft.com/fwlink/?linkid=851728

attendiesType 没有什么特别之处,它是一个基本的 ValueObject,就像 EF Core 并不抱怨的 EventCost 一样。 任何关于这里发生的事情的建议将不胜感激 - 我已经为这个问题绞尽脑汁了几个小时了

c# .net .net-core entity-framework-core entity-framework-migrations
1个回答
0
投票

关键信息是这样的:

请注意,只有映射属性才能绑定到构造函数参数。

您的构造函数参数定义如下:

attendiesType

您的属性定义如下:
AttendeesType

您能找出其中的差异吗?为什么其中一个与另一个不匹配? ^^

© www.soinside.com 2019 - 2024. All rights reserved.