mvc和EF中的多对多关系
我创建了一个博客网站,用户可以使用Entity Framework在我的模型和数据库中Post
博客, Posts
和Tags
之间存在多对多的关系。
在我的数据库中我也有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)
编辑:
我无法在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 Tag有Post的集合导航属性
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
。