我正在ASP.NET MVC中开发一个博客应用程序,我怀疑我更新一些相关类的解决方案是否完全正确。 我有一个代表文本的课程:
public partial class Text
{
public long ID { get; set; }
public string Title { get; set; }
...
public virtual ICollection<Tag> Tags { get; set; }
}
和标签:
public partial class Tag
{
public long ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Text> Texts { get; set; }
}
当我正在编辑文本时,正在传递TextEditorViewModel:
public class TextEditorViewModel
{
public long ID { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public IEnumerable<TagEditorViewModel> Tags { get; set; }
}
TagEditorViewModel是:
public class TagEditorViewModel
{
public long ID { get; set; }
public string Name { get; set; }
public bool IsInText { get; set; }
}
在视图中,我正在检查适当的标签(这由IsInText属性反映),这样可以正常工作并且正确的数据被传递回控制器。 这是我的控制器正在运行的存储库的代码:
Text OriginalText = Mapper.Map<Text>(Text);
IEnumerable<long> tags = OriginalText.Tags.Select(tag => tag.ID);
ICollection<Tag> tagobj = context.Tags.Where(tag => tags.Contains(tag.ID)).ToList();
OriginalText.Tags = tagobj;
Text是TextEditorViewModel的对象,它在post上传回。我正在使用mapper来绑定原始类型,我正在重写所有的集合和引用类型(如上所示),只过滤掉标记为不在文本中的标记。有没有更简单的方法来管理标签而不是查询数据库并重写它们?
答案 0 :(得分:1)
您可以手动将标记附加到上下文,而不是从数据库重新加载它们,因为您拥有足以创建/更新关系的标记ID:
Text OriginalText = Mapper.Map<Text>(Text);
foreach (var tag in OriginalText.Tags)
context.Tags.Attach(tag);
context.Texts.Add(OriginalText);
context.SaveChanges();
(我从你的评论中取了最后两行。)
即使不同标签中的属性没有数据库中的值(ID除外),它也会起作用,因为EF只需要正确的标签ID来创建关系。