是否可以避免重写属性映射“一对多”关系?

时间:2012-03-07 17:41:10

标签: asp.net-mvc entity-framework

我正在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来绑定原始类型,我正在重写所有的集合和引用类型(如上所示),只过滤掉标记为不在文本中的标记。有没有更简单的方法来管理标签而不是查询数据库并重写它们?

1 个答案:

答案 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来创建关系。