我有一篇文章:
public class Article
{
public int Id { get; set; }
public string Text { get; set; }
public Title Title { get; set; }
}
标题:
public class Title
{
public int Id { get; set; }
public string Name { get; set; }
public int MaxChar { get; set; }
}
在您撰写Article
之前,您必须从列表中选择Title
,以便确定Article.Text
的StringLength。意思是,这篇文章只能有一定数量的字符,这取决于作者的“标题”。示例:Title.Name
“Title1”只能编写包含1000个字符(MaxChar
)的文章,而Title.Name
“Title2”可以编写包含3000个字符的文章。所以。这意味着Article.Text
的字符串长度必须来自Title.MaxChar
。
Title
实体是将存储在数据库中的前缀数据。
这是我做得很远的事情: 数据库中的标题列在视图中,其中包含使用“标题”查询字符串创建ArticleController操作的链接:
@Models.Title
@foreach (var item in Model) {
@Html.ActionLink(item.Name, "Create", "Article", new { title = item.Id}, new FormMethod())
}
您填写表格并发布。 HttpPost创建操作:
[HttpPost]
public ActionResult Create(Article article)
{
if (article.Text.Length > article.Title.MaxChar)
{
ModelState.AddModelError("Text",
string.Format("The text must be less than {0} chars bla bla", article.Title.MaxChar));
}
if (ModelState.IsValid)
{
db.Article.Add(article);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(hb);
}
这是问题所在。控制器还添加了一个新的Title
实体。因此,下次我导航到我必须选择标题的视图时,我用来写文章的最后一个实体是重复的。
我应该以一种全新的方式做到这一点,还是有一个小小的调整。只有我能想到的其他事情就是将MaxChar
作为查询字符串发送,并且模型之间根本没有任何关系。看起来有点傻/ webforms kindda。
干杯
更新#1: 也许我这样做的方式不对? 获取创建操作
public ActionResult Create(int title)
{
var model = new Article
{
Title = db.Title.Find(title)
};
return View(model);
}
或许它在模型中?比如,我必须设置外键吗?类似的东西:
[ForeignKey("Title")]
public int MaxChar { get; set; }
public virtual Title Title { get; set; }
但我非常确定我读到了一些不必要的地方,EF会照顾到它。
答案 0 :(得分:1)
您需要区分MVC模型和实体模型。你的MVC文章模型看起来应该是这样的(请记住,关于模型的内容存在一些宗教争论):
public class Article
{
public int Id { get; set; }
public string Text { get; set; }
public int TitleID { get; set; }
public IEnumerable<Title> AvailableTitles {get;set;}
}
在您看来,您可以根据可用的标题创建一个下拉列表,并将其绑定到TitleID属性。可用标题列表将填充在无参数控制器方法(以及模型绑定方法)中。
当模型绑定方法带回TitleID时,根据ID从实体框架中实例化Title对象。使用该Title对象创建实体Article对象,并保存更改。这应该可以让你到达目的地。
答案 1 :(得分:1)
最简单的方法可能是将标题附加到Create
操作中的上下文:
// ...
if (ModelState.IsValid)
{
db.Titles.Attach(article.Title);
db.Article.Add(article);
db.SaveChanges();
return RedirectToAction("Index");
}
// ...
Attach
告诉EF article.Title
已存在于数据库中,从而避免在将文章添加到上下文时插入新的Title
。