你的位置:首页 > ASP.net教程

[ASP.net教程]开发过程中遗漏的知识点(1)


1 EF的级联删除

默认情况下CodeFirst会在外键约束中设置 删除规则 为级联(不会默认设置 更新规则 为级联)
当仅定义了导航属性如
public virtual CategoryCategory{ get; set; }
而没有显示定义外键如
public int CategoryId { get; set; }
CodeFirst不会设置 删除规则 为级联

 比如下面就不会级联 否则就是级联 删除的时候就哗哗全删了

 1 public class Blog:BaseEntity<int> 2   { 3    [Required(ErrorMessage = "{0}是必须的")] 4    [Display(Name = "博客标题")] 5    [StringLength(50, ErrorMessage = "长度必须少于{1}个字")] 6    public string Title { get; set; } 7  8    [Required(ErrorMessage = "{0}是必须的")] 9    [Display(Name = "描述")]10    [StringLength(1000, ErrorMessage = "长度必须少于{1}个字")]11    public string Summary { get; set; }12 13    [Required(ErrorMessage = "{0}是必须的")]14    public string Content { get; set; }15 16    [Required(ErrorMessage = "{0}是必须的")]17    [Display(Name = "创建时间")]18    public DateTime CreateTime { get; set; }19 20    [Required(ErrorMessage = "{0}是必须的")]21    [Display(Name = "阅读量")]22    public int Volume { get; set; }23 24     [Display(Name = "是否发布")]25    public bool Publish { get; set; }26 27    /// <summary>28    /// 栏目29    /// </summary>30    public virtual Category.Category Category { get; set; }31  32   33    //public int CategoryId { get; set; } //如果显示添加外键 便支持级联 此处不希望级联34   }

 

2 AutoMapper 给已有对象赋值

AutoMapper 是ODT第三方类库

 

他默认是new一个对象赋值的

比如:

1  Blog blog;2 blog = Mapper.Map<Blog>(addBlogViewModel);

当我们的blog已经存在其他属性时也会覆盖 ,如果我们不希望这样就要写成:

 Blog blog = blogManager.Find(id);//在原对象基础上赋值 blog = Mapper.Map<ModifyBlogViewModel, Blog>(modifyBlogViewModel, blog);

3 使用TryUpdateModel注意点

如下代码:我从VIEW获取 Category的信息 使用TryUpdateModel

 Category _category = categoryManager.Find(id); if (TryUpdateModel(_category)) {           执行更新操作出错 }

最后发现,我在视图中使用了多个Model产生的同名属性,把另一个Model的属性赋值给了我这个Model,本例是ID同名, 所以出错。

代码修改如下:

1 Category _category = categoryManager.Find(id);2 if (TryUpdateModel(_category, new string[] { "Type", "ParentID", "Name", "Description", "Order", "Target" }))3 { 4   更新操作成功!5 }