gpt4 book ai didi

entity-framework - Entity Framework 代码首次更新错误,带有必需的导航属性已卸载

转载 作者:行者123 更新时间:2023-12-02 04:04:13 25 4
gpt4 key购买 nike

我发现,如果我根据需要设置了导航属性(使用Required属性)并使用了延迟加载代理,则当我加载父实体并且不执行任何操作但尝试保存在同一上下文中时,会发生EntityValidationError,这类似于“必填字段”。

使用Java中的hibernate和.NET中的NHibernate,可以仅获取一个没有导航属性的实体(全部延迟加载),更新它并再次保存。该框架意识到导航引用没有任何变化,并且不会引发任何错误。

下面的例子

[Table("Address")]
public class Address
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int AddressId { get; set; }

[Required, StringLength(512)]
public virtual string AddressLine1 { get; set; }
}

[Table("User")]
public class User
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }

[Required]
public string Name {get; set;}

[Required]
public virtual Address Address {get; set;}


}


void LoadAndSaveUser() {
var user = Context.Users.First();
user.Name = "foo";

// if i comment out this line
// ( probably EF fetches the lazy loaded entiy )
// the code works. it is strange though because i don't access any property/method of the Address

// var dummy = user.Address

Context.SaveChanges();
}

当我尝试在Address属性上没有“Required”属性的情况下,不会发生任何错误。使用Required属性,我得到“Address field is required!”。由于每个用户都应该有一个地址,因此我希望该属性创建一个一致的模型。

在一些论坛中,我发现一些帖子建议在加载父实体时包含导航属性(换句话说,是急于加载),但是如果我们有太多的导航属性,这不是可行的方法。

我是在做错什么,还是有其他方法可以实现这种功能?

最佳答案

public int AddressId类中定义User。每当加载用户时,它就会加载。我认为这将解决问题。

更新:
好吧,我转载了您的问题。您有两种选择可以防止这种情况。但是可以肯定的是。您必须Address属性中删除[Required] 属性。这是问题的根源(这是合理的,因为您要告诉EF“我希望存在Address对象(不是外键,而是导航属性)。如果为null,则抛出异常”)。
另外,在AddressId类中定义int类型的User属性。

注意,您还可以在public virtual ICollection<User> Users { get; set; }实体中定义Address

您可以通过将[Required]放在AddressId上,或使用流畅的api来告诉EF有关必需属性的信息:
在用户映射类中:
this.HasRequired(t => t.Address)
。与许多()
.HasForeignKey(d => d.AddressId);

关于entity-framework - Entity Framework 代码首次更新错误,带有必需的导航属性已卸载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8518486/

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