С помощью Entity Framework, во-первых, как вставить объект с существующим свойством - PullRequest
2 голосов
/ 15 января 2012

Вот простой случай.

У меня есть запись Customer, определенная так:

 public class Customer
   {
      [Key]
      public string Id { get;}
      public UsState UsState { get; set; }
   }

 public class UsState
   {
      [Key]
      public string  StateAbbreviation {get;set;}
      public string  StateName {get;set;}
   }

Я уже заполнил свой UsState 50 штатами, теперь я хочу вставить одну запись Customer, которая связана с существующим состоянием.

Если я скажу что-то вроде:

Customer customer = new Customer() 
             {
                UsState = "CA",
                Id = 1001
             }
dbContext.Customers.add(customer);

Я получаю сообщение об ошибке, в котором говорится, что состояние пытается быть вставлено снова.

Как я могу заставить надстройку использовать существующее состояние, а не пытаться вставлять ее заново. В моей настоящей проблеме много вложенных объектов, которые могут существовать, поэтому мне нужно решить эту проблему в целом.

Спасибо

Ответы [ 2 ]

2 голосов
/ 15 января 2012

Я знаю два способа:

  1. Установите для EntityState то, что подходит для вашего действия, или

  2. Получите UsState из базы данных идобавьте его к клиенту прямо перед сохранением, что даст ему EntityState из UnModified или что-то в этом роде.

, чтобы изменить EntityState, вам нужно перейти к ObjectContext вашего DbContext, как показанов этой теме: Сначала код Entity Framework - нет метода Detach () в DbContext

0 голосов
/ 15 января 2012

Если вы думаете об этом с точки зрения данных таблицы, в вашей таблице Customer должен быть столбец, описывающий состояние клиента. У вас также есть таблица состояний, которую вы можете использовать для объединения вместе, чтобы получить имя штата.

CREATE TABLE customer (
    id  VARCHAR(10),
    state CHAR(2)
)

CREATE TABLE state (
    stateabbreviation CHAR(2),
    statename VARCHAR(50)
)

Столбец "state" - это просто строка, представляющая состояние. Таким образом, ваш класс должен быть определен таким же образом, с использованием и ID, и состояния, и, если вы хотите включить информацию для вашего класса USState, определите свойство типа UsState с определением ForeignKey:

public class Customer
{
    [Key]
    public string Id { get;}
    public string State { get; set; }
    [ForeignKey("State")]
    public UsState UsState { get; set; }
}

Затем при создании новой записи задайте текст строки, а не объект UsState.

Customer customer = new Customer() 
{
    State = "CA",
    Id = 1001
}
dbContext.Customers.add(customer);
...