簡體   English   中英

實體框架保存子級

[英]Entity Framework saving child

我是EF的新手,我的孩子有一些麻煩。 我可以很好地保存一個實體對象的實例,但是當我嘗試保存與該實體相關聯的子代時,它會給我帶來麻煩。 在此處輸入圖片說明

我目前正在使用的模型。

    public bool UpdateSelectedUser(user selectedUser)
    {
        nsdc_supplyEntities ctx = new nsdc_supplyEntities();

        try
        {
            user editUser = ctx.users
                .Include(ug => ug.network_group)
                .Where(u => u.id == selectedUser.id).FirstOrDefault();

            editUser.full_name = selectedUser.full_name;
            editUser.office_phone = selectedUser.office_phone;
            editUser.cell_phone = selectedUser.cell_phone;
            editUser.home_phone = selectedUser.home_phone;
            editUser.text_address = selectedUser.text_address;
            editUser.email = selectedUser.email;

            foreach (network_group group in selectedUser.network_group)
            {
                editUser.network_group.Add(group);
            }

            ctx.SaveChanges();
        }
        catch (Exception e)
        {
        }
    }

我正在使用的代碼。 它在editUser.network_group.Add(group);editUser.network_group.Add(group); 上面寫着“無法定義兩個對象之間的關系,因為它們被附加到不同的ObjectContext對象上”。 我已經對Google和SO上的潛在答案做了一些深入的研究,但到目前為止,還沒有找到解決問題的方法。

-更新-更改組foreach以反映Shyju的建議。 它使我走得更遠,但暴露出另一個問題:

            foreach (network_group group in selectedUser.network_group)
            {
                var groupEntity = new network_group 
                { 
                    id = group.id,
                    full_name = group.full_name,
                    distribution_list_email = group.distribution_list_email
                };
                if (editUser.network_group.Where(g => g.id == groupEntity.id).Count() < 1)
                {
                    editUser.network_group.Add(groupEntity);
                }
            }

有一個獨特的約束引發了錯誤。 我注意到我正在插入一些重復的條目。 因此,現在,如果用戶已經有一個組,則不會添加它。 但是,由於現在我只添加了當前不與用戶相關聯的組,所以我仍然遇到唯一的約束錯誤。 我發現的是,它現在將新組添加到groups表中,然后將其與用戶相關聯。 我想向用戶添加現有組,而不是創建新組。 越來越近! :)

我想這可能會解決問題。 創建新的network_group1對象並設置屬性值,然后將其添加到集合中。

foreach (network_group group in selectedUser.network_group)
{
   var groupEntity=new network_group { id=group.id,full_name=group.ful_lname
                         ,distribution_list_email=group.distribution_list_email};
   editUser.network_group.Add(groupEntity);
}
ctx.SaveChanges();

之所以發生原始錯誤,是因為您將已經在不同上下文中創建的實體添加到了剛創建的上下文中的實體。

// Get the ids
var userGroupIds = selectedUser.network_groups.Select(e => e.id);

// Use the ids to retrieve their equivalent entities from the new context
var userGroups = ctx.network_groups.Where(e => userGroupIds.Contains(e.id));

// Add the groups from the correct context.
foreach (network_group group in userGroups)
{
    editUser.network_group.Add(group);
}

最簡單的方法是確保selectedUser (因此也就是它的network_group )沒有附加到它當前所屬的上下文中。 然后,可以像原始代碼一樣將組添加到新的editUser中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM