是否可以避免重写映射"one-to-many"关系的属性?



我正在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; }
}

在视图中,我正在检查appropiate标记(这反映在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的对象,该对象在发布时传递回。我使用mapper只绑定基元类型,并重写所有集合和引用类型(如上所示),只有在文本中标记为not的标记才会被过滤掉。有没有更简单的方法来管理标签,而不是查询数据库并重写它们?

您可以手动将标签附加到上下文中,而不是从数据库中重新加载它们,因为您有足够的标签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来创建关系。

最新更新