我正在使用asp.net mvc,ef6处理问题/答案软件。我试图解决的问题之一是插入/更新许多项目。例如,如果用户提出问题并添加标签,他们可以选择现有标签或创建新标签。实体框架6多对多插入更新
我剥离下来的问题类是
public class Question
{
private ICollection<Tag> _tags;
public long Id { get; set; }
public string Body { get; set; }
public virtual ICollection<Tag> Tags
{
get { return _tags ?? (_tags = new Collection<Tag>()); }
set { _tags = value; }
}
}
我的标签类就像
public class Tag
{
private ICollection<Question> _questions;
public long Id { get; set; }
public string Text { get; set; }
public virtual ICollection<Question> Questions
{
get { return _questions?? (_questions=new Collection<Question>()); }
set { _questions = value; }
}
}
我的背景是像
public class MyDbContext
: DbContext
{
public virtual DbSet<Tag> Tags { get; set; }
public virtual DbSet<Question> Questions { get; set; }
}
当我需要保存的问题标签我必须手动检查用户是否添加了标签问题是否存在。如果它们不存在,我创建它们并保存上下文,然后返回标签并将它们添加到问题中。我想知道是否有更好的方法在EF6中做这样的事情?
我的示例代码如下
public IEnumerable<Tag> CreateOrRetrieveTags(IList<string> tags)
{
List<string> availableTags = (from t in _context.Tags
where tags.Contains(t.Text)
select t.Text).ToList();
var missingTags = tags.Except(availableTags, StringComparer.OrdinalIgnoreCase);
foreach (string missingTag in missingTags)
{
_context.Tags.Add(new Tag
{
Text = missingTag
});
}
_context.SaveChanges();
return from t in _context.Tags
where tags.Contains(t.Text)
select t;
}
但是在那个阶段我没有完整的标签。有点像Stackoverflow时,用户添加标签问题我只有标签字符串/文本。 – 2014-09-29 18:48:03
@QaiserIftikhar你不需要完整的标签。如果是新标签,你可以在javascript中创建一个标签对象,默认为零。 – 2014-09-29 18:49:47
对不起,不知道你的意思。我从用户那里得到的是一个带有特定字段的表单,例如问题主体,标题,标签。我收到的标签文本类似于wpf,c#,mvc,java。我用逗号分隔标签文本,然后根据文本询问我的上下文以查看数据库中的标签。在那个阶段,我如何创建一个完整的标签而不是首先检索与用户输入的标签匹配的标签列表? – 2014-09-29 18:54:44