C# EF Core:无法通过OwnsOne属性修改错误

C# EF Core:无法通过OwnsOne属性修改错误,c#,entity-framework,ef-core-2.2,C#,Entity Framework,Ef Core 2.2,我正在使用EF Core管理SQL Server 2016数据库(采用代码优先的方法)。特别是,我有两个实体之间的关系:Events和ObjectsForEvents 这些实体是: // Base entity: all entities extends this class public class BaseEntity : IEntity { public Guid Id { get; set; } } // Event entity: parent entity public c

我正在使用EF Core管理SQL Server 2016数据库(采用代码优先的方法)。特别是,我有两个实体之间的关系:Events和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);
});
有人能帮我吗

更新1 我已尝试更改实体的键,但仍不起作用:

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

                entity.OwnsOne(e => e.ElectricPowerValue);
                entity.OwnsOne(e => e.ThermalPowerValue);
            });
modelBuilder.Entity(Entity=>
{
HasKey(e=>new{e.Id});
entity.OwnsOne(e=>e.powervalue);
entity.OwnsOne(e=>e.ThermalPowerValue);
});
问题在于c#通过引用传递对象(而不是值)。这意味着在insert中,它尝试将
obj.ThermalPowerValue
作为引用传递,而不是插入新值

ElectricPowerValue = obj.ElectricPowerValue != null ? obj.ElectricPowerValue : new ObjectForEventPowerValue(),
ThermalPowerValue = obj.ThermalPowerValue != null ? obj.ThermalPowerValue : new ObjectForEventPowerValue()
您可以尝试以下代码:

foreach(加法器中的var加法器)
{
foreach(eventWithRecursiveCriteria.Objects中的var obj)
{
等待此消息。\u objectsForEventService.Create(新建ObjectForEventTo
{
EventId=addedEvent.Id,
ObjectId=对象Id,
ElectricPowerValue=obj.ElectricPowerValue!=null?新建ObjectForEventPowerValue(){Min=obj.ElectricPowerValue.Min,Max=obj.ElectricPowerValue.Max}:新建ObjectForEventPowerValue(),
ThermalPowerValue=obj.ThermalPowerValue!=null?新建ObjectForEventPowerValue(){Min=obj.ThermalPowerValue.Min,Max=obj.ThermalPowerValue.Max}:新建ObjectForEventPowerValue()
}).配置等待(错误);
};
}
问题在于c#通过引用传递对象(而不是值)。这意味着在insert中,它尝试将
obj.ThermalPowerValue
作为引用传递,而不是插入新值

ElectricPowerValue = obj.ElectricPowerValue != null ? obj.ElectricPowerValue : new ObjectForEventPowerValue(),
ThermalPowerValue = obj.ThermalPowerValue != null ? obj.ThermalPowerValue : new ObjectForEventPowerValue()
您可以尝试以下代码:

foreach(加法器中的var加法器)
{
foreach(eventWithRecursiveCriteria.Objects中的var obj)
{
等待此消息。\u objectsForEventService.Create(新建ObjectForEventTo
{
EventId=addedEvent.Id,
ObjectId=对象Id,
ElectricPowerValue=obj.ElectricPowerValue!=null?新建ObjectForEventPowerValue(){Min=obj.ElectricPowerValue.Min,Max=obj.ElectricPowerValue.Max}:新建ObjectForEventPowerValue(),
ThermalPowerValue=obj.ThermalPowerValue!=null?新建ObjectForEventPowerValue(){Min=obj.ThermalPowerValue.Min,Max=obj.ThermalPowerValue.Max}:新建ObjectForEventPowerValue()
}).配置等待(错误);
};
}

试试这个pls entity.HasKey(e=>new{e.Id})@PedroBrito请查看我的更新问题尝试此pls entity.HasKey(e=>new{e.Id})@佩德罗布里托,请看我最新的问题