Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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#_.net_Entity Framework - Fatal编程技术网

C# 向现有关系添加其他记录不起作用

C# 向现有关系添加其他记录不起作用,c#,.net,entity-framework,C#,.net,Entity Framework,我试图向现有的客户端添加一个新的模板,但当我试图使用现有的客户端ID添加模板时,它会使用新的客户端ID添加一个新的模板,而不是将新模板绑定到现有的客户端ID 我使用以下代码来确定当前客户端是否存在模板。如果没有,我将使用传入的现有客户端创建一个模板 public Template GetCurrentTemplate(Client c, string TemplateName) { using (var Context = new mssDBContext()) {

我试图向现有的
客户端添加一个新的
模板
,但当我试图使用现有的
客户端ID
添加
模板
时,它会使用新的
客户端ID
添加一个新的
模板
,而不是将新模板绑定到现有的
客户端ID

我使用以下代码来确定当前
客户端是否存在
模板
。如果没有,我将使用传入的现有
客户端创建一个
模板

public Template GetCurrentTemplate(Client c, string TemplateName)
{
    using (var Context = new mssDBContext())
    {
        List<Template> CurrentTemplates = Context.Templates.Where(x =>  x.TemplateName == TemplateName && x.TemplateClient.Id == c.Id).ToList();
        if (CurrentTemplates.Count == 0)
        {
            Template t = new Template { TemplateName = TemplateName};
            t.TemplateClient = c;
            Context.Templates.Add(t);
            Context.SaveChanges();
            return t;
        }
        else
            return CurrentTemplates[0];
    }
 }
公共模板GetCurrentTemplate(客户端c,字符串TemplateName)
{
使用(var Context=new mssDBContext())
{
列出CurrentTemplates=Context.Templates.Where(x=>x.TemplateName==TemplateName&&x.TemplateClient.Id==c.Id).ToList();
如果(CurrentTemplates.Count==0)
{
模板t=新模板{TemplateName=TemplateName};
t、 TemplateClient=c;
Context.Templates.Add(t);
SaveChanges();
返回t;
}
其他的
返回当前模板[0];
}
}
我得到的是:

我想要的是使用现有的
ClientId
添加
模板
,而不是添加Id为19的新
客户端
,并将其绑定到
模板

我做错了什么


谢谢。

传递给方法的客户机c
实例不受当前
上下文实例的约束,因此它会添加一个新的
客户机
,并将模板绑定到它。如果您在
模板
实体上设置了
TemplateClient\u Id
属性,则该问题几乎没有解决方法。您只需对其进行设置,而无需通过替换来分配客户端:

t.TemplateClient = c;
与:

否则,您可以将
客户端
实例附加到db上下文:

Context.Attach(c);
t.TemplateClient = c;
Context.Templates.Add(t);
Context.SaveChanges();

谢谢你,我在其他地方看到过Attach,但我拒绝了它,因为我的上下文和你写的一样,没有一个直接的Attach方法?不管怎样,我添加了“Context.Clients.Attach(c)”,似乎效果不错:)@MajorSqueeze是的,我的代码是EF Core的,似乎EF6和以前的版本在
DbSet
级别上有
Attach
。我很乐意帮忙!
Context.Attach(c);
t.TemplateClient = c;
Context.Templates.Add(t);
Context.SaveChanges();