首页 新闻 会员 周边

mvc+entity framework database first,生成的model每次更新一个表会更新所有的model

0
悬赏园豆:30 [已关闭问题] 关闭于 2014-08-19 15:19
EF使用的database first ,然后从数据库生成的model层,因为开发使用的是MVC,要使用DataAnnotations验证,
然后 在EF生成的Model层的属性上加一些特性,如用户表Users的UserName字段,
[Required(ErrorMessage = "用户名不能为空")]
[Display(Name = "用户名")]
[MaxLength(20, ErrorMessage = "最多20个字符")]
public string UserName { get; set; }
,这样页面增删改查没问题的,但是每次当数据库有更新的时候,我在edmx页面中,选择“从数据库更新模型”,
哪些只有一个表改动,也会把所有的model都给更新掉,以至于要重新加这些特性,可以怎样做让每次只更新一个model吗
求助,要怎样做好一点,为每个页面重新写一个viewmodel吗?
那样岂不太麻烦了,初接触EF,有什么好的建议望回复,多谢了
engtech的主页 engtech | 初学一级 | 园豆:149
提问于:2013-08-04 13:35
< >
分享
所有回答(4)
0

从数据库更新模型,不是可以选择表(视图、过程)吗?

幻天芒 | 园豆:37175 (高人七级) | 2013-08-04 21:37

是的 可以选择表的,但是我这更新一个表,会把所有的model实体都更新掉呢

支持(0) 反对(0) engtech | 园豆:149 (初学一级) | 2013-08-04 23:54

@engtech: 你用的是EF自带的实体生成器?

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2013-08-05 00:20

@幻天芒: 个人还是更习惯DBFirst~

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2013-08-05 00:20

@幻天芒: 不是自带的,用的是扩展的DbContext Generator

支持(0) 反对(0) engtech | 园豆:149 (初学一级) | 2013-08-05 09:13
0

用code first就好了。或则你可以使用fluent API代替DataAnnotations验证

参考:
http://q.cnblogs.com/q/38974/
http://www.cnblogs.com/qouoww/archive/2012/01/03/2310855.html
滴答的雨 | 园豆:3660 (老鸟四级) | 2013-08-04 23:50

呃。有没有可能把属性 和 验证分开写在不同类里。。用code first 是不存在这种问题的,现在数据库都已建好,只是可能偶尔增改一些字段,用db 习惯一些,请教生成的edm可以用fluent API验证吗,怎么写呢

支持(0) 反对(0) engtech | 园豆:149 (初学一级) | 2013-08-05 00:01

@engtech: 有分开的啊,fluent API 验证,你看看第二个链接,里面有说的,不然就在前面两节有说。

支持(0) 反对(0) 滴答的雨 | 园豆:3660 (老鸟四级) | 2013-08-05 01:01

@滴答的雨:  我的意思是fluentAPI我知道怎么应用到codefirst模式,里边的一些验证或者关联等都是定义到OnModelCreating,如下,那要怎么把这些验证用到db first里生成的edm呢?应该把这些写在哪里?求教

protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//移除复数表名的契约
            modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); //移除一对多级联删除约定
            modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();//移除多对多级联删除约定

            //1对多 User-Dept
            modelBuilder.Entity<User>()
                .HasOptional(x => x.Dept)
                .WithMany(u => u.Users);

            //Role-Menu 多对多
            modelBuilder.Entity<Role>()
            .HasMany(c => c.Menus).WithMany(i => i.Roles)
            .Map(t => t.MapLeftKey("MenuId")
                .MapRightKey("RoleId")
                .ToTable("Re_Role_Menu"));

支持(0) 反对(0) engtech | 园豆:149 (初学一级) | 2013-08-05 09:28
0

自己写生成模板,类似T4

geass.. | 园豆:1821 (小虾三级) | 2013-08-05 09:37
0

你好,你这个问题后来解决了吗?

jimmyzheng | 园豆:202 (菜鸟二级) | 2014-05-06 16:15

解决了

    [MetadataType(typeof(RoleData))]
    public partial class Sys_Role
    {
        class RoleData
        {
            [Required(ErrorMessage = "*")]
            [Display(Name = "角色名")]
            [StringLength(20, ErrorMessage = "最多20个字符")]
            public string RoleName { get; set; }
            [Display(Name = "描述")]
            [StringLength(200, ErrorMessage = "最多200个字符")]
            public string RoleDesc { get; set; }
            [Display(Name = "启用状态")]
            public bool Status { get; set; }

            [Display(Name = "角色类型")]
            public Nullable<byte> RoleType { get; set; }

        }
    }

支持(0) 反对(0) engtech | 园豆:149 (初学一级) | 2014-05-06 16:19

利用MetadataType把这些验证写在一个分部类里,这样就可以了

支持(0) 反对(0) engtech | 园豆:149 (初学一级) | 2014-05-06 16:20

@engtech:   这种方法我也实验了一下。 但是不管用。、  不知道我问题出在哪。  楼主可以加个QQ深入交流一下不?

支持(0) 反对(0) 刘剑_1989 | 园豆:4 (初学一级) | 2015-01-27 15:09

@刘剑_1989: 问题解决了吗?就是这样就可以了,你做一个分部类,把要验证的属性放在这里,这样每次从数据库更新的时候就不会有问题了,

[MetadataType(typeof(RoleData))]
    public partial class Sys_Role
    {
        class RoleData
        {
            [Required(ErrorMessage = "*")]
            [Display(Name = "角色名")]
            [StringLength(20, ErrorMessage = "最多20个字符")]
            public string RoleName { get; set; }
            [Display(Name = "描述")]
            [StringLength(200, ErrorMessage = "最多200个字符")]
            public string RoleDesc { get; set; }
            [Display(Name = "启用状态")]
            public bool Status { get; set; }

            [Display(Name = "角色类型")]
            public Nullable<byte> RoleType { get; set; }

        }
    }

支持(0) 反对(0) engtech | 园豆:149 (初学一级) | 2015-01-30 21:25

@engtech: 感谢楼主。 已实现。  谢谢啦 

支持(0) 反对(0) 刘剑_1989 | 园豆:4 (初学一级) | 2015-02-03 09:55

@engtech: 我刚学这个,用了这种方法没成功...

支持(0) 反对(0) 小奉手 | 园豆:148 (初学一级) | 2016-03-03 14:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册