使用具有不同地址类型的单个地址实体的实体框架

本文关键字:实体 类型 框架 单个地址 地址 | 更新日期: 2023-09-27 18:21:26

Shop
public int ShopID {get;set;}
public string ShopName {get;set;}
public List<ShopAddresses> addresses {get;set;};
ShopAddresses
public int ShopId {get;set;}
public int AddressId {get;set;}
public Shop Shop {get;set;}
public Address Address {get;set;};
public AddressType AddressType {get;set;} //Enum value 1= physical 2 = postal
Address
public int AddressId {get;set;}
public string AddressLine1 {get;set;}

当我使用两个商店地址更新商店对象时,我收到以下错误。

保存或接受更改失败,因为"地址"类型的多个实体具有相同的主键值。确保显式设置的主键值是唯一的。确保在数据库和实体框架模型中正确配置了数据库生成的主键。使用实体设计器进行数据库优先/模型优先配置。使用"HasDatabaseGenerated Option"fluent API 或 'DatabaseGenerated Attribute' 进行代码优先配置。

我收到此错误的原因是我在商店类中的 ShopAddresses 集合有两个具有相同 ID 但地址类型不同的地址。这期望,因为我想对不同的地址类型使用相同的地址。实体框架看到 ShopAddresses 中有两个具有相同主键的新地址,并引发错误。

有没有办法先为这种情况配置实体框架代码?

解决方法:

我可以通过使用 new 关键字手动创建 1 个地址并将其分配给物理地址和邮政地址 (ShopAddresses( 来避免这种情况。这种方法似乎有点矫枉过正。

另一种方法是在数据库中创建具有相同详细信息但不同地址类型的重复地址。如果实体框架不支持我的方案,我可能会采用这种方法。

使用具有不同地址类型的单个地址实体的实体框架

你应该像这样设置你的类:

public class Shop
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual List<ShopAddress> Addresses { get; set; } 
}
public class ShopAddress
{
    public int Id { get; set; }
    public virtual Address Address { get; set; }
    public AddressType AddressType { get; set; }
}
public enum AddressType
{
    Postal,
    Physical
}
public class Address
{
    public int Id { get; set; }
    public string AddressLine { get; set; }
}

之后,您可以重用如下地址:

var address = new Address
{
    AddressLine = "1 Time square"
};
context.Addresses.Add(address);
context.Shops.Add(new Shop
{
    Name = "venerik.com",
    Addresses = new List<ShopAddress>
    {
        new ShopAddress {Address = address, AddressType = AddressType.Physical},
        new ShopAddress {Address = address, AddressType = AddressType.Postal}
    }
});
context.SaveChanges();

祝你好运。