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
Entity framework 如何使用实体框架在联接表中插入数据?_Entity Framework_Join - Fatal编程技术网

Entity framework 如何使用实体框架在联接表中插入数据?

Entity framework 如何使用实体框架在联接表中插入数据?,entity-framework,join,Entity Framework,Join,我是实体框架的新手,希望能在“联接表”中插入数据方面得到一些帮助 我有三个表,Profiles,Tags,还有一个名为ProfilesTags的表连接这两个表。类首先从数据库/DB自动生成 公共部分类配置文件 { 公众简介() { this.ProfilesTags=newhashset(); } 公共int ProfileId{get;set;} 公共字符串名称{get;set;} ... 公共虚拟ICollection配置文件stags{get;set;} } 公共部分类标记 { 公共标签(

我是实体框架的新手,希望能在“联接表”中插入数据方面得到一些帮助

我有三个表,
Profiles
Tags
,还有一个名为
ProfilesTags
的表连接这两个表。类首先从数据库/DB自动生成

公共部分类配置文件
{
公众简介()
{
this.ProfilesTags=newhashset();
}
公共int ProfileId{get;set;}
公共字符串名称{get;set;}
...
公共虚拟ICollection配置文件stags{get;set;}
}
公共部分类标记
{
公共标签()
{
this.ProfilesTags=newhashset();
}
public int TagId{get;set;}
公共字符串标记{get;set;}
公共虚拟ICollection配置文件stags{get;set;}
}
公共部分类概要文件
{
公共int Id{get;set;}
公共int ProfileId{get;set;}
public int TagId{get;set;}
公共虚拟标记{get;set;}
公共虚拟配置文件{get;set;}
}
我有一个
SaveTags
方法,如下所示:

public void保存标记(int profileId,IEnumerable标记)
{
var pr=Context.Profiles.First(p=>p.ProfileId==ProfileId);
//删除任何现有的
pr.ProfilesTags.Clear();
if(tags==null | |!tags.Any())
返回;
var id=tags.Select(value=>value.value);
var Name=tags.Select(value=>value.Name);
//从[tags]-表中获取要查找的标记列表
var tagsList=Context.Tags.Where(t=>ids.Any(v=>t.TagId==v)| name.Any(v=>t.Tag==v)).ToList();
foreach(标记中的变量名称值)
{
var tag=tagsList.FirstOrDefault(t=>t.TagId==nameValue.Value | | t.tag.ToLower()==nameValue.Name.ToLower());
//标记已在[Tags]中,无需重新创建id,只需将其关联即可。
如果(标记!=null)
{
var tagModel=newprofilestags()
{
TagId=nameValue.Value,
ProfileId=ProfileId
};
pr.ProfilesTags.Add(tagModel);
}
//首先在[Tags]表中创建新项并添加关联[ProfilesTags]
其他的
{
var newTag=newtags{Tag=nameValue.Name};
//如何将此新添加的标记与pr.ProfilesTags关联?
//做什么/如何进行?
Context.Tags.Add(newTag);
}
}
Context.SaveChanges()
}

如何将
newTag
pr.ProfilesTags
关联

似乎
newTag
应该首先有一个有效的id,然后通过
ProfilesTags
建立关系

// create new item in [Tags] table first and add association [ProfilesTags]
else
{
     var newTag = new Tags { Tag = nameValue.Name};

     // how do I associate this newly added tag to pr.ProfilesTags ?
     // what to do / how to procede?

     Context.Tags.Add(newTag);

     // Let newTag has a valid tagId
     Context.SaveChanges();

     // Build the relationship between `Profiles` and `Tags`.
     var newProfileTag = new ProfilesTags();

     /// Build the relationship by ForeignKey,
     /// Or, call pr.ProfilesTags.Add(newProfileTag)
     newProfileTag.ProfiledId = pr.ProfileId; 
     newProfileTag.TagId = newTag.TagId; //< It SHOULD NOT be zero...
     Context.ProfilesTags.Add(newProfileTag);

     // Save the newProfileTag.....
     // Context.SaveChanges();
}
//首先在[Tags]表中创建新项并添加关联[ProfilesTags]
其他的
{
var newTag=newtags{Tag=nameValue.Name};
//如何将此新添加的标记与pr.ProfilesTags关联?
//做什么/如何进行?
Context.Tags.Add(newTag);
//让newTag有一个有效的tagId
SaveChanges();
//在“Profiles”和“Tags”之间建立关系。
var newProfileTag=newprofilestags();
///通过外键建立关系,
///或者,调用pr.ProfilesTags.Add(newProfileTag)
newProfileTag.ProfiledId=pr.ProfileId;
newProfileTag.TagId=newTag.TagId;//<不应为零。。。
Context.ProfilesTags.Add(newProfileTag);
//保存newProfileTag。。。。。
//SaveChanges();
}

谢谢-这似乎有效,但随后又出现了另一个问题。我第一次向profiles添加新标记时,它就工作了。但是,如果我随后编辑配置文件并只保存它而不添加新标记(或删除现有标记),那么我会得到一个错误-调用
pr.ProfilesTags.Add(tagModel)即,它只是将现有标记添加到模型中。错误为
操作失败:无法更改关系,因为一个或多个外键属性不可为空。对关系进行更改时,相关外键属性设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
如错误消息所述,
ProfilesTag
的外键、
ProfileId
TagId
不得为空(或零)。如果要删除现有的
标签
,则需要先删除相关的
档案标签
。如果在
标签
档案标签
之间配置了
级联删除
,数据库引擎将自动执行此操作。当您删除现有的
标签
时,相关
档案标签
的外键
TagId
将自动设置为
null
。但是您的db模式不允许这种情况,因此您会得到错误。为了保持数据库的
一致性
,在删除
标记之前,可能需要删除那些相关的
档案标记
。谢谢-我已经接受了答案。而不是
pr.ProfilesTags.Clear()我使用了
pr.ProfilesTags.RemoveRange()。据我所知.Clear()是由于父/子关系而导致问题的。