EF4 ObjectContext.EntitySet.AddObject () каскадные вставки - PullRequest
2 голосов
/ 29 октября 2010

Как я могу добавить сущность в базу данных через EF4, не подключая сначала все свои ссылочные сущности?

var entity = new MyEntity() { FK_ID = 4 }; // associated entity key

using (var db = new MyEntities())
{
    db.MyEntity.AddObject(entity);

    db.SaveChanges();
    db.AcceptAllChanges();
}

Этот код пытается также вставить новый FK_Entity со значением по умолчанию.

Я вижу некоторые предложения в Интернете, что мне нужно сначала присоединить FK_Entity, а затем установить свойство MyEntity.FK для присоединенного FK_Entity, но это кажется ужасным.1) Я предполагаю, что для присоединения требуется загрузка FK_Entity, которая мне не нужна, просто чтобы вставить сущность - я уже дал ей правильный ключ, и SQL выполнит ссылочную целостность, если я сделаю ошибку.2) Поскольку у меня есть больше ссылок, я должен прикрепить каждую из них ??

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 29 октября 2010

Я обнаружил, что MVC Binder (или что-то еще) создает пустую FK_Entity, чего я не хочу. Поэтому я Exclude = "FK_Entity" в свойствах обработчика контроллера Create () и продолжаю просто устанавливать свойство fk_id.

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

1 голос
/ 29 октября 2010

То, что вы можете попытаться сделать, - это создать фиктивные сущности FK, для каждого из которых установлено только свойство ID. И убедитесь, что они имеют EntityStatus.Unchanged в ObjectStateManager, чтобы EF не пытался «обновить» и переписать все остальные свойства сущностей FK.

У меня нет возможности проверить это, но что-то вроде:

var fkEntity = new FK_Entity { ID = 4 };
var entity = new MyEntity { FK_Entity = fkEntity };

using (var db = new MyEntities())
{
    db.AddToEntities(entity);
    ObjectStateEntry fkEntry = db.ObjectStateManager.GetObjectStateEntry(fkEntity);
    // You can check the state here while debugging, but it's probably `Added`
    fkEntity.ChangeState(EntityState.Unchanged);

    db.SaveChanges();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...