gpt4 book ai didi

entity-framework - MVC 3 EF 4.1 dbContext - 删除具有不可为空的外键关系的一对多数据对象

转载 作者:行者123 更新时间:2023-12-04 07:14:55 24 4
gpt4 key购买 nike

我正在使用 MVC 3、EF 4.1 和 dbContext。我需要知道如何使用不可为空的外键删除一对多关系中的实体。

当我删除子实体并执行 SaveChanges 时,出现错误:

操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性将设置为空值。如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。

从其他帖子中,我了解到使用 Remove(entity) 标记要删除的实体。在 SaveChanges 期间,EF 将外键设置为 Null 并出现上述错误。

我发现一些帖子在子实体上使用 DeleteObject 而不是 Remove;然而,由于增加了 dbContext 和 DbSet,DeleteObject 方法似乎已被删除。

我发现一些帖子建议将 EDMX 外键关系修改为 Nullable。修改 EDMX 没问题,但是每当完成数据库的更新模型时,这些更改就会失效,必须重新应用。不是最优的。

另一篇文章建议创建一个外键关系设置为 Nullable 的代理实体,但我不明白这种方法。它似乎遇到与修改 EDMX 相同的问题,因为当保存对 EDMX 的更改时,上下文会自动更新。

我的简化模型是:

public partial class User
{
public User()
{
this.UserContacts = new HashSet<UserContact>();
}

public long userId { get; set; }
public string userEmail { get; set; }
public string userPassword { get; set; }
public string userFirstName { get; set; }
public string userLastName { get; set; }
. . .
public virtual Country Country { get; set; }
public virtual State State { get; set; }
public virtual ICollection<UserContact> UserContacts { get; set; }
}

}
public partial class UserContact
{
public long userContactId { get; set; }
public long userContactUserId { get; set; }
public long userContactTypeId { get; set; }
public string userContactData { get; set; }

public virtual ContactType ContactType { get; set; }
public virtual User User { get; set; }
}

userContactUserId 和 userContactTypeId 是必需的外键。

在 dbContext 容器中,Users 和 UserContact 都是 DbSet。

我有一个用于用户的 ViewModel 和一个用于 UserContact 的 ViewModel 如下
public class UserContactViewModel
{
[HiddenInput]
public long UserContactId { get; set; }

[HiddenInput]
public long UserContactUserId { get; set; }

[Display(Name = "Contact")]
[Required]
public string ContactData { get; set; }

[Required]
public long ContactType { get; set; }

[HiddenInput]
public bool isDeleted { get; set; }

}

public class MyProfileViewModel
{

[HiddenInput]
public long UserId { get; set; }

[Required]
[Display(Name = "First Name")]
[StringLength(100)]
public string FirstName { get; set; }

[Required]
[StringLength(100)]
[Display(Name = "Last Name")]
public string LastName { get; set; }
....
public IEnumerable<UserContactViewModel> Contacts { get; set; }

}

在保存对用户配置文件的更改时,我会遍历 UserContactViewModel 实体列表以确定已添加、修改或删除的实体。
                    foreach (var c in model.Contacts)
{
UserContact uc = usr.UserContacts.Single(con => con.userContactId == c.UserContactId);
if (uc != null)
{
if (c.isDeleted == true) // Deleted UserContact
{
ctx.UserContacts.Remove(uc); // Remove doesn't work
}
else // Modified UserContact
{
uc.userContactData = c.ContactData;
uc.userContactTypeId = c.ContactType;
ctx.Entry(uc).State = EntityState.Modified;
}
}
else // New UserContact
{
usr.UserContacts.Add(new UserContact { userContactUserId = model.UserId, userContactData = c.ContactData, userContactTypeId = c.ContactType });
}
}

我很感激任何帮助。

最佳答案

我设法解决了这个问题,如下所示:

首先,我能够通过将我的 DbContext(例如“ctx”)转换为 IObjectContextAdapter 然后获取对 ObjectContext 的引用来获取 ObjectContext。

接下来,我只是调用 DeleteObject 方法传递要删除的 UserContact 记录。

当 SaveChanges 获取数据库中的删除时,按预期发生。

if (c.isDeleted == true)  // Deleted UserContact
{
ObjectContext oc = ((IObjectContextAdapter)ctx).ObjectContext;
oc.DeleteObject(uc)
}

这是相关代码的片段:
foreach (var c in model.Contacts)
{
UserContact uc = null;
if (c.UserContactId != 0)
{
uc = ctx.UserContacts.Find(c.UserContactId);
}
if (uc != null)
{
if (c.isDeleted == true) // Deleted UserContact
{
ObjectContext oc = ((IObjectContextAdapter)ctx).ObjectContext;
oc.DeleteObject(uc);
}
else // Modified UserContact
{
uc.userContactData = c.ContactData;
uc.userContactTypeId = c.ContactType;
ctx.Entry(uc).State = EntityState.Modified;
}
}
else // New UserContact
{
usr.UserContacts.Add(new UserContact { userContactData = c.ContactData, userContactTypeId = c.ContactType });
}
}

ctx.Entry(usr).State = EntityState.Modified;
ctx.SaveChanges();

希望这对将来的人有所帮助。

关于entity-framework - MVC 3 EF 4.1 dbContext - 删除具有不可为空的外键关系的一对多数据对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5889886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com