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,有什么好的建议望回复,多谢了
从数据库更新模型,不是可以选择表(视图、过程)吗?
是的 可以选择表的,但是我这更新一个表,会把所有的model实体都更新掉呢
@engtech: 你用的是EF自带的实体生成器?
@幻天芒: 个人还是更习惯DBFirst~
@幻天芒: 不是自带的,用的是扩展的DbContext Generator
用code first就好了。或则你可以使用fluent API代替DataAnnotations验证
参考:
http://q.cnblogs.com/q/38974/
http://www.cnblogs.com/qouoww/archive/2012/01/03/2310855.html
呃。有没有可能把属性 和 验证分开写在不同类里。。用code first 是不存在这种问题的,现在数据库都已建好,只是可能偶尔增改一些字段,用db 习惯一些,请教生成的edm可以用fluent API验证吗,怎么写呢
@engtech: 有分开的啊,fluent API 验证,你看看第二个链接,里面有说的,不然就在前面两节有说。
@滴答的雨: 我的意思是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"));
自己写生成模板,类似T4
你好,你这个问题后来解决了吗?
解决了
[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; }
}
}
利用MetadataType把这些验证写在一个分部类里,这样就可以了
@engtech: 这种方法我也实验了一下。 但是不管用。、 不知道我问题出在哪。 楼主可以加个QQ深入交流一下不?
@刘剑_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; }
}
}
@engtech: 感谢楼主。 已实现。 谢谢啦
@engtech: 我刚学这个,用了这种方法没成功...