使用具有不同地址类型的单个地址实体的实体框架
问题描述:
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;}
当我使用两个ShopAddresses更新Shop对象时,出现以下错误。使用具有不同地址类型的单个地址实体的实体框架
保存或接受更改失败,因为类型为“地址”的多个实体具有相同的主键值。确保显式设置的主键值是唯一的。确保数据库生成的主键在数据库和实体框架模型中配置正确。使用实体设计器进行数据库优先/模型优先配置。为什么我收到这个错误是因为我ShopAddresses收藏店铺等级有相同的ID,但不同的地址类型的两个地址使用“HasDatabaseGeneratedOption”一口流利的API或‘DatabaseGeneratedAttribute’的代码首先配置。
原因。这期望,因为我想使用相同的地址为不同的地址类型。实体框架看到,你有两个新地址ShopAddresses中具有相同的主键,它会抛出错误。
有没有办法配置entityframework代码为此场景?
解决方法:
我可以通过使用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();
好运。