C# EF和通用存储库,如何使其在更新时不添加新实体

C# EF和通用存储库,如何使其在更新时不添加新实体,c#,entity-framework,entity-framework-5,C#,Entity Framework,Entity Framework 5,尝试添加具有非新对象/实体图的新实体时遇到问题 以下是我采用代码优先方法的域类型: public class Person : IEntity { public int Id { get; set; } public string Name { get; set; } public List<PersonSession> Sessions { get; set; } } public class PersonSession : IEntity { pu

尝试添加具有非新对象/实体图的新实体时遇到问题

以下是我采用代码优先方法的域类型:

public class Person : IEntity
{
   public int Id { get; set; }
   public string Name { get; set; }
   public List<PersonSession> Sessions { get; set; }
}

 public class PersonSession : IEntity
 {
    public int Id { get; set; }
    public Person Person { get; set; }
    public Session Session { get; set; }
 }

public class Session : IEntity
{
  public int Id { get; set; }
  public string Title { get; set; }     
}
因此,当我创建2个新会话,然后通过会话的通用Repo实例添加它们时,它们被正确添加

当我尝试创建一个新的人并给他一些现有的会话时,如下所示:

  private static void AddPerson()
  {

     var newPerson = new Person
                        {
                           JobTitle = EJobTitle.SoftwareDeveloper,
                           Name = "Mark W",
                        };

     var sessionsForPerson = new List<PersonSession>();

     var session1 = _sessionRepo.Retrieve(1);
     var session2 = _sessionRepo.Retrieve(2);

     sessionsForPerson.Add(new PersonSession
                              {
                                 Session = session1,
                                 Person = newPerson
                              });

     sessionsForPerson.Add(new PersonSession
                              {
                                 Session = session2,
                                 Person = newPerson,
                              });

     newPerson.Sessions = sessionsForPerson;

     _personRepo.Save(newPerson);
  }
private static void AddPerson()
{
var newPerson=新的人
{
JobTitle=EJobTitle.SoftwareDeveloper,
Name=“Mark W”,
};
var sessionsForPerson=新列表();
var session1=_sessionRepo.Retrieve(1);
var session2=_sessionRepo.Retrieve(2);
sessionsForPerson.Add(新人员会话)
{
会话=会话1,
人=新人
});
sessionsForPerson.Add(新人员会话)
{
会话=会话2,
Person=newPerson,
});
newPerson.Sessions=sessionsForPerson;
_personRepo.Save(新人);
}
这是第二次添加会话

我是否可以在PersonSession.Session属性上设置一个数据属性,告诉它这将始终是一个现有会话,或者我是否需要使用FluentApi中的某些内容来指示EF


谢谢。

尝试指定哪些属性是实体键:

public class Person : IEntity
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public List<PersonSession> Sessions { get; set; }
}

 public class PersonSession : IEntity
 {
    [Key]
    public int Id { get; set; }
    public Person Person { get; set; }
    public Session Session { get; set; }
 }

public class Session : IEntity
{ 
    [Key]
    public int Id { get; set; }
    public string Title { get; set; }     
}
公共类人员:IEntity
{
[关键]
公共int Id{get;set;}
公共字符串名称{get;set;}
公共列表会话{get;set;}
}
公共类人员会话:IEntity
{
[关键]
公共int Id{get;set;}
公众人物{get;set;}
公共会话会话{get;set;}
}
公开课:科学性
{ 
[关键]
公共int Id{get;set;}
公共字符串标题{get;set;}
}

在您的
保存
方法中,您将新
人员的状态设置为
实体状态。已添加
。执行此操作时,EF将对象图中每个对象的状态设置为添加的
会话
s已经具有Id>0并不重要。除非图形中的对象以前由同一上下文检索。在这种情况下,它们保持不变(并且只保存关联)


这就是问题所在。每个存储库都有自己的上下文。这是通用存储库的常见问题。一种可能的补救方法是在存储库之外创建一个上下文,并将其注入到一个业务事务所涉及的存储库中。另一种方法是确保现有对象在添加根实体后通过遍历对象图以未修改的状态进入上下文。

yeah不会更改结果。我找到的唯一解决方案是为每种类型手动创建一个repo,并且在该repo的存储集中,如果图形中的实体不是新的,则将其设置为“未更改”或“已修改”,这样可以正常工作。仍然希望有1个通用存储库用于任何类型。我想这是不可能的。
public class Person : IEntity
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public List<PersonSession> Sessions { get; set; }
}

 public class PersonSession : IEntity
 {
    [Key]
    public int Id { get; set; }
    public Person Person { get; set; }
    public Session Session { get; set; }
 }

public class Session : IEntity
{ 
    [Key]
    public int Id { get; set; }
    public string Title { get; set; }     
}