Entity framework 实体框架-添加父对象时,我不';我不想这样
在一对多关系中,我有两个对象(WishListItem和Product)。WishListItem必须有一个产品。每个产品可以是0-n个愿望列表Entity framework 实体框架-添加父对象时,我不';我不想这样,entity-framework,Entity Framework,在一对多关系中,我有两个对象(WishListItem和Product)。WishListItem必须有一个产品。每个产品可以是0-n个愿望列表 public class WishListItem { public int Id { get; set; } public int ProductId { get; set; } public Product Product { get; set; } } public class Product { public
public class WishListItem
{
public int Id { get; set; }
public int ProductId { get; set; }
public Product Product { get; set; }
}
public class Product
{
public int Id { get; set; }
// ... other properties
}
该产品不了解愿望清单。所有的产品都存在。我只想添加一个新的愿望列表。我对这种关系的愿望是:
HasRequired(p=>p.Product).WithMany().HasForeignKey(p=>p.ProductId)代码>
当我尝试添加如下新项目时:
WishListItem item = new WishListItem();
// ... sets properties
WishListItems.Add(item); // WishListItems is of type DbSet<WishListItem>
SaveChanges();
WishListItem项=新建WishListItem();
// ... 设置属性
愿望列表。添加(项目);//WishListItems为DbSet类型
保存更改();
这段代码似乎还试图添加一个产品。我不想添加新产品(甚至不想更新)。产品属性设置为空。如何告诉实体框架我只想添加WishListItem?我是否需要忽略产品属性(通过在我的WishListItem模型中执行Ignore(p=>p.Product);
)并在加载我的WishListItem对象时分别加载产品?这对我有效,无需添加任何新地址记录。在这个模型中,这个人有一个可选的家庭地址,但这个地址并不知道这个人
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual Address HomeAddress { get; set; }
public int HomeAddress_id { get; set; }
}
public class Address
{
public int Id { get; set; }
public string PhoneNumber { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Country { get; set; }
}
在DbContext
覆盖中,我有以下代码
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.HasRequired(t => t.HomeAddress).WithMany()
.HasForeignKey(t => t.HomeAddress_id);
}
这适用于我,无需添加任何新地址记录。在这个模型中,这个人有一个可选的家庭地址,但这个地址并不知道这个人
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual Address HomeAddress { get; set; }
public int HomeAddress_id { get; set; }
}
public class Address
{
public int Id { get; set; }
public string PhoneNumber { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Country { get; set; }
}
在DbContext
覆盖中,我有以下代码
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.HasRequired(t => t.HomeAddress).WithMany()
.HasForeignKey(t => t.HomeAddress_id);
}
我已经解决了我的问题。问题来自产品对象上的另一个属性
private bool _isFreeShippingInitialValue;
public bool IsFreeShipping
{
get
{
return _isFreeShippingInitialValue ||
computedValueFromAnotherChildObject;
}
set
{
_isFreeShippingInitialValue = value;
}
}
我们注意到,当您第一次获取产品对象时,在加载任何子对象之前,会调用IsFreeShipping.get
(不确定为什么)。例如,如果\u isFreeShippingInitialValue
为false,并且另一个childobject的计算值
为true,IsFreeShipping
首先返回false(因为另一个childobject的计算值
在没有加载子对象的情况下第一次为false),下次尝试获取IsFreeShipping
时为true。这使EF认为该值已更改
我们添加到WishListItems
的第一项工作正常。这是第二件坏掉的东西。我们相信SaveChanges()
(或之前的内容)为第一个WishListItem
加载了产品。当我们添加第二项时,SaveChanges()
正在破坏第一项的产品
因此,简而言之,在计算属性中的值时要小心。使用子对象获取,因为它会咬你的屁股。我已经解决了我的问题。问题来自产品对象上的另一个属性
private bool _isFreeShippingInitialValue;
public bool IsFreeShipping
{
get
{
return _isFreeShippingInitialValue ||
computedValueFromAnotherChildObject;
}
set
{
_isFreeShippingInitialValue = value;
}
}
我们注意到,当您第一次获取产品对象时,在加载任何子对象之前,会调用IsFreeShipping.get
(不确定为什么)。例如,如果\u isFreeShippingInitialValue
为false,并且另一个childobject的计算值
为true,IsFreeShipping
首先返回false(因为另一个childobject的计算值
在没有加载子对象的情况下第一次为false),下次尝试获取IsFreeShipping
时为true。这使EF认为该值已更改
我们添加到WishListItems
的第一项工作正常。这是第二件坏掉的东西。我们相信SaveChanges()
(或之前的内容)为第一个WishListItem
加载了产品。当我们添加第二项时,SaveChanges()
正在破坏第一项的产品
因此,简而言之,在计算属性中的值时要小心。使用子对象获取,因为它会咬你的屁股。在这种情况下,产品应该是可选的,所以它应该是这样的。HasOptional(..)和ProductId应该是一个可为空的intI尝试HasOptional(p=>p.product)。WithMany().HasForeignKey(p=>p.ProductId);代码>具有相同的结果。ProductId实际上是一个字符串,但我压缩了类,这样您就可以很容易地看到我在做什么,而不是一堆与问题无关的属性。在这种情况下,product应该是可选的,所以它应该是这样的。HasOptional(..)和ProductId应该是一个可空的intI-TreadyHasOptional(p=>p.product).WithMany().HasForeignKey(p=>p.ProductId)代码>具有相同的结果。ProductId实际上是一个字符串,但我压缩了这些类,这样您就可以很容易地看到我在做什么,而不是一堆与问题无关的属性。如果您将HomeAddress_id设置为现有地址,该怎么办。在我的情况下,即使我不想添加或更新产品,我也需要提供ProductId。WishListItem必须有一个与之关联的产品。如果此人有一个必需的家庭地址,我已更新了上面的代码。如果您将家庭地址\u id设置为现有地址,该怎么办。在我的情况下,即使我不想添加或更新产品,我也需要提供ProductId。WishListItem必须有一个与之关联的产品。如果此人有所需的家庭地址,我已经更新了上面的代码。