Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 实体框架-添加父对象时,我不';我不想这样_Entity Framework - Fatal编程技术网

Entity framework 实体框架-添加父对象时,我不';我不想这样

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

在一对多关系中,我有两个对象(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 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-Tready
HasOptional(p=>p.product).WithMany().HasForeignKey(p=>p.ProductId)具有相同的结果。ProductId实际上是一个字符串,但我压缩了这些类,这样您就可以很容易地看到我在做什么,而不是一堆与问题无关的属性。如果您将HomeAddress_id设置为现有地址,该怎么办。在我的情况下,即使我不想添加或更新产品,我也需要提供ProductId。WishListItem必须有一个与之关联的产品。如果此人有一个必需的家庭地址,我已更新了上面的代码。如果您将家庭地址\u id设置为现有地址,该怎么办。在我的情况下,即使我不想添加或更新产品,我也需要提供ProductId。WishListItem必须有一个与之关联的产品。如果此人有所需的家庭地址,我已经更新了上面的代码。