EF核心:无法修改OwnsOne属性的错误

我正在使用EF Core管理SQL Server 2016数据库(采用代码优先方法)。特别是,我在两个实体之间建立了联系:事件和ObjectsForEvents。

这些是实体:

// Base entity: all entities extends this class
public class BaseEntity : IEntity
{
    public Guid Id { get; set; }
}

// Event entity: parent entity
public class EventEntity : BaseEntity
{
    public EventTypes Type { get; set; }
    public string Title { get; set; }
    public long StartAt { get; set; }
    public long EndAt { get; set; }
    public Guid? RecursiveCriteriaId { get; set; }
}

// Objects for events: child entity
public class ObjectForEventEntity : BaseEntity
{
    public Guid EventId { get; set; }
    public Guid ObjectId { get; set; }
    public ObjectForEventPowerValue ElectricPowerValue { get; set; }
    public ObjectForEventPowerValue ThermalPowerValue { get; set; }
}

当我尝试将许多事件与其对象一起插入时,插入来自第一个事件的对象不会出现问题。尝试为第二个事件插入对象时,EF引发以下错误:

The property 'ObjectForEventEntityId' on entity type 'ObjectForEventEntity.ElectricPowerValue#ObjectForEventPowerValue' is part of a key and so cannot be modified or marked as modified. To change the principal of an existing entity with an identifying foreign key first delete the dependent and invoke 'SaveChanges' then associate the dependent with the new principal.

ElectricPowerValue基于此类:

public class ObjectForEventPowerValue
{
    public float Min { get; set; }
    public float Max { get; set; }
}

并且在数据库上下文中声明如下:

modelBuilder.Entity<ObjectForEventEntity>(entity =>
{
        entity.HasKey(e => e.Id);

        entity.OwnsOne(e => e.ElectricPowerValue);
        entity.OwnsOne(e => e.ThermalPowerValue);
});

这是插入对象的代码的一部分:

foreach (var addedEvent in addedEvents)
            {
                foreach (var obj in eventWithRecursiveCriteria.Objects)
                {
                    await this._objectsForEventService.Create(new ObjectForEventDto
                    {
                        EventId = addedEvent.Id,ObjectId = obj.Id,ElectricPowerValue = obj.ElectricPowerValue != null ? obj.ElectricPowerValue : new ObjectForEventPowerValue(),ThermalPowerValue = obj.ThermalPowerValue != null ? obj.ThermalPowerValue : new ObjectForEventPowerValue()
                    }).ConfigureAwait(false);
                };
            }

有人可以帮助我吗?

更新1 我试图更改实体的键,但仍然无法正常工作:

modelBuilder.Entity<ObjectForEventEntity>(entity =>
            {
                entity.HasKey(e => new { e.Id });

                entity.OwnsOne(e => e.ElectricPowerValue);
                entity.OwnsOne(e => e.ThermalPowerValue);
            });
yangshegnhui 回答:EF核心:无法修改OwnsOne属性的错误

问题是c#通过引用传递对象(不是值)。这意味着在插入中,它尝试将obj.ThermalPowerValue作为参考传递,而不是插入新值。

ElectricPowerValue = obj.ElectricPowerValue != null ? obj.ElectricPowerValue : new ObjectForEventPowerValue(),ThermalPowerValue = obj.ThermalPowerValue != null ? obj.ThermalPowerValue : new ObjectForEventPowerValue()

您可以尝试以下代码:

foreach (var addedEvent in addedEvents)
            {
                foreach (var obj in eventWithRecursiveCriteria.Objects)
                {
                    await this._objectsForEventService.Create(new ObjectForEventDto
                    {
                        EventId = addedEvent.Id,ObjectId = obj.Id,ElectricPowerValue = obj.ElectricPowerValue != null ? new ObjectForEventPowerValue(){Min = obj.ElectricPowerValue.Min,Max = obj.ElectricPowerValue.Max} : new ObjectForEventPowerValue(),ThermalPowerValue = obj.ThermalPowerValue != null ? new ObjectForEventPowerValue(){Min = obj.ThermalPowerValue.Min,Max = obj.ThermalPowerValue.Max} : new ObjectForEventPowerValue()
                    }).ConfigureAwait(false);
                };
            }
本文链接:https://www.f2er.com/3073754.html

大家都在问