2015-11-11 3 views
0
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;} 

Когда я обновляю объект Shop двумя ShopAddresses, я получаю следующую ошибку.Entity Framework с использованием одного адреса с другим адресом адреса

Не удалось сохранить или принять изменения, поскольку более одного объекта типа «Адрес» имеют одинаковое значение первичного ключа. Убедитесь, что явно заданные значения первичного ключа уникальны. Убедитесь, что первичные ключи базы данных настроены правильно в базе данных и в модели Entity Framework. Используйте конструктор Entity Designer для конфигурации First First/Model First. Используйте «HasDatabaseGeneratedOption» свободно API или „DatabaseGeneratedAttribute“ для кода первой конфигурации.

Причина, почему я получаю эту ошибку, потому что моя коллекция ShopAddresses в магазин класса имеет два адреса с одинаковым идентификатором, но разных типов адресов. Это ожидание, поскольку я хочу использовать один и тот же адрес для другого типа адреса. Структура Entity видит, что у вас есть два новых адреса в ShopAddresses с тем же самым первичным ключом, и он выдает ошибку.

Есть ли способ сначала сконфигурировать код сущности для этого сценария?

Обход проблемы:

Я могу избежать этого, создав вручную 1 адрес с помощью нового ключевого слова и назначив его физическому и почтовому адресу (ShopAddresses). Этот подход кажется немного излишним.

Другой способ - создать повторяющийся адрес в базе данных с теми же данными, но с другим типом адреса. Я мог бы пойти с таким подходом, если инфраструктура сущности не поддерживает мой сценарий.

ответ

0

Вы должны настроить свои классы, как это:

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(); 

удачи.

Смежные вопросы