mvc和EF中的多对多关系

我创建了一个博客网站,用户可以使用Entity Framework在我的模型和数据库中Post博客, PostsTags之间存在多对多的关系。

在我的数据库中我也有PostTagMap ,但是我在EF模型中没有看到这个。 不确定我是否需要。 PostTagMap只包含Post和Tag的唯一标识符。

(应该注意我从模型中创建了数据库)

在我的Create Post视图(和控制器)上,我希望用户可以选择创建标签(以及post),确保他们彼此识别。 但是我找不到办法做到这一点。

邮政模式:

 public partial class Post { public Post() { this.Tags = new HashSet(); } public int Id { get; set; } public string BlogUserEmail { get; set; } public int CategoryId { get; set; } public string Title { get; set; } public string ShortDescription { get; set; } [AllowHtml] public string Description { get; set; } public string Meta { get; set; } public string UrlSlug { get; set; } public bool Published { get; set; } public System.DateTime PostedOn { get; set; } public Nullable Modified { get; set; } public virtual BlogUser BlogUser { get; set; } public virtual Category Category { get; set; } public virtual ICollection Tags { get; set; } } 

Create

@using (Html.BeginForm()) { @Html.AntiForgeryToken() @Html.ValidationSummary(true)
Post
@Html.HiddenFor(model => model.BlogUserEmail, User.Identity.Name)
@Html.ValidationMessageFor(model => model.BlogUserEmail)
@Html.LabelFor(model => model.CategoryId, "Category")
@Html.DropDownList("CategoryId", String.Empty) @Html.ValidationMessageFor(model => model.CategoryId)
@Html.LabelFor(model => model.Title)
@Html.EditorFor(model => model.Title) @Html.ValidationMessageFor(model => model.Title)
@Html.LabelFor(model => model.ShortDescription)
@Html.EditorFor(model => model.ShortDescription) @Html.ValidationMessageFor(model => model.ShortDescription)
@Html.TextAreaFor(model => model.Description)
@Html.ValidationMessageFor(model => model.Description)

编辑:

我无法在Create视图中使用EditorFor字段来标记。 这是因为Create视图绑定到@Model MyBlogger.Post

标签只显示为集合,如果我说:

 @Html.EditorFor(model => m.Tags) 

然后它在渲染时在我的视图中显示为空白。

我试过一个foreach但是没有用。 对于在我的Create视图中尝试此操作的实例:

 @foreach (var item in Model.Tags) { @Html.EditorFor(model => item.Name) @Html.EditorFor(model => item.Description) @Html.EditorFor(model => item.UrlSlug) } 

我收到错误: Object reference not set to an instance of an object.

Many-to-Many关系中如果使用DataAnnotation EF将创建多对多关系。 在你的情况下

Post类具有Tag的集合导航属性

 public virtual ICollection Tags { get; set; } 

And TagPost的集合导航属性

  public virtual ICollection Posts { get; set; } 

这将在post和标签之间创建多对多关系。


在你看来:

有几种方法可以添加/获取标记ID的值,将其绑定到模型的一种方法是尝试以下方法,因为您已经在两个模型之间建立了关系:

  
@Html.EditorFor(model => model.Tags.Id) @Html.ValidationMessageFor(model => model.Tags.Id)

如果你需要一个你需要明确指定它的属性(例如Id,Name ……), model.Tags返回一个Tags集合

插入M-to-M关系:

 if (ModelState.IsValid) { Tag tag = new tag{id=post.Tags.Id}; db.Tag.Attach(tag); db.Tag.Add(tag); db.Posts.Add(post); db.SaveChanges(); return RedirectToAction("Index"); } 

EF模型中不显示多对多表。 要向其添加行,您必须创建类似:PostObject1.Tags.Add(TagObject1)或TagObject1.Posts.Add(PostObject1)。

以下是如何执行此操作: 插入/更新多个entity framework。 我该怎么做?

要选择行,您需要EF对象并访问另一个表的列表。

关联(映射)表可能不会显示在EF模型中,但您可以轻松添加新标记

 post.Tags.add(new Tag(){ Name = ""}); 

作为一种好的做法您应该创建视图模型,而不是直接将模型用于视图,

这是帮助您链接的链接

对于标签,您可以执行EditorTemplate(推荐)或For循环

这是for循环示例

 @for(var i=0;i model.Tags[i].Name) } 

对于新建

只需Add New按钮,然后onclick ,只需添加一个新文本框,但将Id设置为Tags[i].Name ,其中i是标记的Count()+1