Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
C# 通过将新对象指定给子实例来更新子对象_C#_Entity Framework - Fatal编程技术网

C# 通过将新对象指定给子实例来更新子对象

C# 通过将新对象指定给子实例来更新子对象,c#,entity-framework,C#,Entity Framework,这应该是一个基本的C#问题。假设我有一个p.Type==“Cat”); currentCat=更新的CAT; //Resharper为currentCat显示“分配的值未在任何执行路径中使用” //而且当前的cat从未更新过 Console.WriteLine(“\r\n尝试通过将新Cat分配给现有Cat来更新Cat后的设置状态(名称应为“Felix”,但不是):”; 列表宠物(myPerson); Console.ReadLine(); } 公共作废清单宠物(人) { foreach(var个

这应该是一个基本的C#问题。假设我有一个
类,它包含一个名为
的属性,它是一个
列表

如果我想更新宠物,我可以将宠物作为一个变量,并对其属性进行操作,但我似乎无法创建新的宠物对象并将其分配给现有的宠物对象。我得到一个“赋值不用于任何执行路径”警告。我创建了一些非常简单的代码来概述这个问题

在我的实际代码中,我希望能够使用新的子对象并替换现有的对象。如果您能告诉我如何使用下面的示例updatedCat做到这一点,我将不胜感激

class Program
{
  static void Main(string[] args)
  {
    var program = new Program();
    program.RunMe();
  }

  public void RunMe()
  {
    var myPerson = new Person() { Name = "John Doe" };
    var dog = new Pet() { Type = "Dog", Name = "Woofie" };
    var cat = new Pet() { Type = "Cat", Name = "Chester" };
    myPerson.Pets.Add(dog);
    myPerson.Pets.Add(cat);
    Console.WriteLine("Initial Pet Status:");
    ListPets(myPerson);

    var currentDog = myPerson.Pets.SingleOrDefault(p => p.Type == "Dog");
    currentDog.Name = "Snoopie";
    Console.WriteLine("\r\nPet Status After Updating Dog Directly (name should be 'Snoopie'):");
    ListPets(myPerson);

    var updatedCat = new Pet() { Type = "Cat", Name = "Felix" };
    var currentCat = myPerson.Pets.SingleOrDefault(p => p.Type == "Cat");
    currentCat = updatedCat; 
    //Resharper shows "Value assigned is not used in any execution path" for the currentCat
    //and the current cat is never updated
    Console.WriteLine("\r\nPet Status After Trying to Update Cat by Assigning a New Cat to existing Cat (name should be 'Felix' but it's not):");
    ListPets(myPerson);

    Console.ReadLine();
  }

  public void ListPets(Person person)
  {
    foreach (var pet in person.Pets)
    {
      Console.WriteLine(string.Format("   {0} has a {1} named {2}", person.Name, pet.Type, pet.Name));
    }
  }
}

public class Person
{
  public string Name { get; set; }
  public List<Pet> Pets { get; set; }

  public Person()
  {
    Pets = new List<Pet>();
  }
}

public class Pet
{
  public string Type { get; set; }
  public string Name { get; set; }
}
类程序
{
静态void Main(字符串[]参数)
{
var program=新程序();
program.RunMe();
}
public void RunMe()
{
var myPerson=newperson(){Name=“John Doe”};
var dog=new Pet(){Type=“dog”,Name=“Woofie”};
var cat=new Pet(){Type=“cat”,Name=“Chester”};
myPerson.Pets.Add(狗);
myPerson.Pets.Add(cat);
Console.WriteLine(“初始宠物状态:”);
列表宠物(myPerson);
var currentDog=myPerson.Pets.SingleOrDefault(p=>p.Type==“Dog”);
currentDog.Name=“Snoopie”;
Console.WriteLine(“\r\n直接更新Dog后的设置状态(名称应为“Snoopie”):”;
列表宠物(myPerson);
var updatedCat=new Pet(){Type=“Cat”,Name=“Felix”};
var currentCat=myPerson.Pets.SingleOrDefault(p=>p.Type==“Cat”);
currentCat=更新的CAT;
//Resharper为currentCat显示“分配的值未在任何执行路径中使用”
//而且当前的cat从未更新过
Console.WriteLine(“\r\n尝试通过将新Cat分配给现有Cat来更新Cat后的设置状态(名称应为“Felix”,但不是):”;
列表宠物(myPerson);
Console.ReadLine();
}
公共作废清单宠物(人)
{
foreach(var个人宠物。宠物)
{
WriteLine(string.Format(“{0}有一个名为{2}的{1}”、person.Name、pet.Type、pet.Name));
}
}
}
公共阶层人士
{
公共字符串名称{get;set;}
公共列表宠物{get;set;}
公众人士()
{
Pets=新列表();
}
}
公营宠物
{
公共字符串类型{get;set;}
公共字符串名称{get;set;}
}
编辑以向Pet添加Id值并创建InsertOrUpdatePet方法 (注意:为了简洁起见,我删除了Console.Writeline命令)

类程序
{
静态void Main(字符串[]参数)
{
var program=新程序();
program.RunMe();
}
public void RunMe()
{
var myPerson=newperson(){Name=“John Doe”};
var dog=new Pet(){Id=1,Type=“dog”,Name=“Woofie”};
var cat=new Pet(){Id=2,Type=“cat”,Name=“Chester”};
myPerson.Pets.Add(狗);
myPerson.Pets.Add(cat);
var updatedCat=new Pet(){Id=2,Type=“Cat”,Name=“Felix”};
InsertOrUpdatePet(myPerson,updatedCat);
var currentCat=myPerson.Pets.SingleOrDefault(p=>p.Type==“Cat”);
}
公共作废插件更新宠物(个人,宠物)
{
var currentPet=person.Pets.SingleOrDefault(p=>p.Id==pet.Id);
if(currentPet==null)
{
person.Pets.Add(pet);
}
其他的
{
currentPet=pet;//这不起作用
person.Pets.SingleOrDefault(p=>p.Id==pet.Id)=pet;//这会抛出一个错误
}
}
}
公共阶层人士
{
公共字符串名称{get;set;}
公共列表宠物{get;set;}
公众人士()
{
Pets=新列表();
}
}
公营宠物
{
公共int Id{get;set;}
公共字符串类型{get;set;}
公共字符串名称{get;set;}
}

您需要移除要替换的宠物并添加新宠物

或者,你可以说

person.Pets[index] = new Pet() { Type = "Cat", Name = "Felix" };
其中
index
是您要替换的宠物的索引

您不理解的是,Pet列表仅仅是对Pet实例的引用列表


获取对其中一个Pet实例的引用并将其存储在变量中,并将引用分配给Pet的新实例,不会更改列表中任何引用引用的引用位置。当然不是,您还没有在中修改列表。这就是为什么必须删除要替换的元素并添加新元素,或者直接将对新实例的引用指定给要替换的元素

这取决于你在概念上想做什么。如果你想说这个人摆脱了那只老猫,现在又有了一只新猫,你应该这样做:先移走那只老猫,然后移走那只新猫:

var updatedCat = new Pet() { Type = "Cat", Name = "Felix" };
var currentCat = myPerson.Pets.SingleOrDefault(p => p.Type == "Cat");
myPerson.Remove(currentCat);
myPerson.Add(updatedCat);
另一方面,如果此人仍然拥有同一只猫,但该猫已被重命名,则您应重命名旧猫,就像您对狗所做的那样:

var currentCat = myPerson.Pets.SingleOrDefault(p => p.Type == "Cat");
currentCat.Name = "Felix";

您的代码不起作用,因为
currentCat
引用的是cat,而不是列表中的点。如果您想以某种方式表示列表中的点,可以按照Jason的建议,在列表中使用索引。

看起来您还不了解对象和对象引用之间的区别。你可能想做一些研究谢谢Jason。。。这开始有意义了,但我编辑了我的原始问题,以更接近地显示我在真实代码中所做的事情。我希望在我的业务层中有一个InsertOrUpdate方法,可以更新“pet”(或者根据唯一的Id值添加一个新的方法,如果它不存在)。我对更新的部分感到困惑。如果更新的pet参数作为变量进入方法,如何更新Person.Pets集合?这有意义吗?谢谢斯维克。正如我在下面对Jason所说的,并在我的编辑中显示的,如果我创建了一个UpdateOrInsert方法,并且更新的pet参数作为变量进入该方法,我如何更新Person.Pets集合?因为我使用的是实体框架,上下文是
var currentCat = myPerson.Pets.SingleOrDefault(p => p.Type == "Cat");
currentCat.Name = "Felix";