2013-11-15 6 views
0

У меня есть две таблицы: родительский и дочерний. Оба имеют поле indentity автоинкремента в качестве первичного ключа. У ребенка есть поле, которое содержит идентификатор родителя, и имеет FK, обеспечивающий соблюдение этих отношений.Обновление родительской записи с идентификатором дочерней записи в Entity Framework

Родитель имеет поле, содержащее идентификатор последнего ребенка.

CREATE TABLE parent 
(
    parentid int IDENTITY(1,1) NOT NULL, 
    latestchildid int, 
    parentdata nvarchar(256), 
    CONSTRAINT PK_parent PRIMARY KEY CLUSTERED 
    (
     parentid 
    ) 
) 

CREATE TABLE child 
(
    parentid int, 
    childid int IDENTITY(1,1) NOT NULL, 
    childdata nvarchar(256), 
    CONSTRAINT PK_child PRIMARY KEY CLUSTERED 
    (
     parentid, 
     childid 
    ) 
) 

ALTER TABLE child 
ADD CONSTRAINT FK_child_parent 
FOREIGN KEY (parentid) 
REFERENCES parent (parentid) 

public partial class parent 
{ 
    public int parentid { get; set; } 
    public int latestchildid { get; set; } 
    public string parentdata { get; set; } 

    public virtual ICollection<child> child {get; set; } 
} 

public partial class child 
{ 
    public int parentid { get; set; } 
    public int childid { get; set; } 
    public string childdata { get; set; } 

    public virtual parent { get; set; } 
} 

Как вставить новую родительскую запись и новую запись ребенка и обновить последнее поле ребенка в родителе, в одной транзакции?

Что работает:

var parent = new parent 
    { 
     parentdata = "Some info about a parent" 
    }; 

var child = new child 
    { 
     childdata = "Some info about a child" 
    }; 

parent.child.Add(child); 
dbContext.parents.Add(parent); 
dbContext.SaveChanges(); 

parent.latestchildid = child.childid; 
dbContext.SaveChanges(); 

Проблема с этим состоит в том, что он требует двух операций.

Но если я завершу все это в TransactionScope, в любое время EF решает использовать разные соединения для разных частей (что является решением, которое практически не контролируется), оно способствует транзакции для распространения, что требует что MSDTC должен быть настроен и запущен как на машине пользователя, так и на узле базы данных. Это непревзойденное обострение.

Итак, могу ли я получить значение childid и записать его родительскому, без необходимости одновременного вызова SaveChanges()?

Или я могу каким-то образом заставить EF использовать одно соединение для этой транзакции, чтобы оно не способствовало его распространению?

ответ

0

Создайте еще Ограничить для внешнего ключа отношения между родителем и ребенком с помощью latestchildid в качестве первичного ключа

Затем добавьте в свой родительский класс public virtual child latestchild {get; set; }

Затем добавить новое задание перед первым сохранить изменения parent.latestchild = child;

Удалите последние 2 строки, где вы назначаете и сохраняете снова

+0

Обнаружены круговые отношения с ограничениями ссылочной целостности. –

+0

Что такое версия EF? а также вы можете опубликовать модель –

+0

EF 6.0 - и какую модель вы имеете в виду? Я разместил ETO DTO, и я не могу понять, насколько важны модели домена бизнес-уровня или модели представления пользовательского интерфейса. –

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