У меня есть две таблицы: родительский и дочерний. Оба имеют поле 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 использовать одно соединение для этой транзакции, чтобы оно не способствовало его распространению?
Обнаружены круговые отношения с ограничениями ссылочной целостности. –
Что такое версия EF? а также вы можете опубликовать модель –
EF 6.0 - и какую модель вы имеете в виду? Я разместил ETO DTO, и я не могу понять, насколько важны модели домена бизнес-уровня или модели представления пользовательского интерфейса. –