2013-07-29 3 views
1

Мне интересно, возможно ли, что я пытаюсь сделать, используя Entity Framework (5). Чтобы быть простым, у меня есть 2 классовEntity Framework избегает вставки удвоений

public class Value 
{ 
    public int Id {get; set;} 
    public int Content {get; set;} 
    public virtual ICollection<Constraint> Constraints {get; set;} 
} 

public class Constraint 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
    public string Type {get; set;} 
} 

В моей бизнес-логике я считаю два аналогичных Constraint, если пара (имя, тип) аналогична. Где-то в коде я связываю Constraint к значению, как:

Value v1 = new Value() { Content = 42 }; 
Constraint c1 = new Constraint() {Name = "A", Type = "B" }; 
v1.Constraints.Add(c1); 

Value v2 = new Value() { Content = 43 }; 
Constraint c2 = new Constraint() {Name = "A", Type = "B" }; 
v2.Constraints.Add(c2); 

, а затем, у меня есть другая часть ПЕРСИСТЕНТНОСТИ слоя, ответственны для вставки значений в базе данных:

ValueRepository.Insert(v1); 
ValueRepository.Insert(v2); 

Имея уникальных ограничение на таблицу «Ограничение» на пару (Name, Type), я хочу избежать ошибки ввода при вставке c2. Как мне сказать EF рассмотреть c2 так же, как c1?

PS: Я не могу использовать репозиторий Constraint для инициализации объектов Constraint.

+0

Дайте значение Id при вставке данных в базу данных. –

+0

Какие еще свойства имеет Constraint, что привело бы к существованию более чем одного объекта с одинаковым значением ключа? Что вы намерены делать, когда есть две Ограничения с идентичными ключами - уведомить пользователя и попросить их изменить ввод, или выбросить другое исключение вместо уникального нарушения ключа? Или вы хотите удалить всех обманов, кроме одного? –

+0

Я не хочу сохранять дубликаты одного и того же ограничения в таблице базы данных, это то, что я пытаюсь сделать. добавив к этому, после вставки я хочу, чтобы c1 указывал значения v1 и v2, а не только v1. – enenkey

ответ

1

EF не может этого сделать для вас, потому что он построен на предположении, что объекты не являются обменными значениями. Экземпляры объектов сопоставляются строкам. Каждый отдельный экземпляр независим.

Поэтому вам необходимо убедиться, что вы не вставляете в двойное вложение. Методы, которые в порядке предпочтения:

  1. изменить логику вашего приложения, чтобы не генерировать дублирует
  2. Перед созданием экземпляра сущности, проверить базу данных, существует ли уже он (IOW выполнить запрос)
  3. Handle исключение.

Не использовать (3), потому что его трудно обрабатывать только эта ошибка. Скорее всего, вы также проглотите несвязанные. Например, вы можете ошибочно принять сетевую ошибку как указание на то, что объект уже существует.

+0

Благодарим вас за ответ. Я думал добавить триггер вставки таблицы, чтобы избежать вставки удвоений, но я не знаю, каково было бы состояние объекта c2. – enenkey

+0

Не меняйте данные за задней панелью EF. Это начнет действовать странно, потому что думает, что c2 находится в БД, пока это действительно не так. – usr