Vb.net 如何更新实体的主键

Vb.net 如何更新实体的主键,vb.net,entity-framework-core,Vb.net,Entity Framework Core,在您告诉我更改实体的主键是个坏主意之前,让我告诉您我完全同意 如果我有一个实体并试图更改主键,那么这对数据完整性来说是个坏主意 但是,假设您有一个用于连接两个实体的实体。两个实体都有一个Id(主键)。要更改的实体引用其他两个实体的主键。我想更改对其中一个实体的引用(但它被定义为主键) 例如: Class Customer Public Property Id As Integer Public Property Name as String End Class Class Ad

在您告诉我更改实体的主键是个坏主意之前,让我告诉您我完全同意

如果我有一个实体并试图更改主键,那么这对数据完整性来说是个坏主意

但是,假设您有一个用于连接两个实体的实体。两个实体都有一个Id(主键)。要更改的实体引用其他两个实体的主键。我想更改对其中一个实体的引用(但它被定义为主键)

例如:

Class Customer
    Public Property Id As Integer
    Public Property Name as String
End Class

Class Address
    Public Property ID As Integer
    Public Property Description As String
End Class

Class CustomerAddressAssignments
    Public Property CustomerID As Integer
    Public Property Customer As Customer
    Public Property AddressID As Integer
    Public Property Address As Address
End Class
客户配置:
builder.ToTable(“客户”).HasKey(函数(k)k.ID)

地址的配置:
builder.ToTable(“地址”).HasKey(函数(k)k.ID)

CustomerAddressAssignments的配置:
builder.ToTable(“CustomerAddresses”).HasKey(函数(k)使用{k.CustomerID,k.AddressID}新建)

现在,我已加载CustomerAddressAssignment,并希望更改与此分配关联的客户/地址。

我应该如何做到这一点?当我试图保存所做的更改时:属性“CustomerAddressAssignment.AddressID”是键的一部分,因此无法修改或标记为已修改。

您没有更改主键;你在换外键?通过在中间人表中更改personid映射到的地址ID,您的人正在“搬家”

只需删除旧映射并创建一个新映射。或者更好的方法是,将
MovedOutOnDate
属性设置为DateTime。现在,创建一个新的映射,这样您就可以维护此人的整个地址历史记录,以备将来需要(并且此人的当前地址定义为MovedOutOnDate为空的地址)


如果映射表开始存储更多信息或与自身的其他表相关(例如,订单历史记录表记录了发货人和开票地址)然后该表可以有自己的单列PK,这样它所涉及的其他表就不会有双列FK

了,不要更改主键。就是这么简单。如果您想要不同的customer和address组合,请删除当前记录并创建具有所需组合的新记录。如果您希望能够编辑现有记录然后添加另一个属性作为主键,并在
CustomerID
AddressID
的组合上放置一个唯一索引。然后,您可以在不更改主键的情况下更改这些ID。也就是说,似乎更改
CustomerID
都是错误的。这也似乎是多重的对于相同的
地址
的客户也将是错误的,因此此模式似乎是错误的。我建议
地址
对于
客户
应该是唯一的,即使两个
地址
记录包含相同的数据。