EF 6.x Code First 求教数据库字段不映射到实体类的方法

时间:2021-08-05 14:52:26
我是在现有数据库上,用Code First.
问题1,
实体类的字段可以通过NotMapped实现不映射到数据库,也不在数据建立对应字段.
那反过来呢,因为我的表有一些TimeStamp和GUID字段,还有标准行生成时间的DateTime字段,这些字段本身特殊用途,对实体类没有任何意义.我不希望映射到实体类,应该如何做呢?

问题2,
我是否可以完全不适用EF的迁移工具,就是从头到尾自己写实体类和Context,我在实体类中自己定义字段,定义Key和关系.如果数据库的表有修改,我自己手动改实体类,反过来,如果实体类修改,我自己去改数据库的表.这样是否可以呢?我觉得这样是不是最灵活?虽然比较辛苦一点.

谢谢!

13 个解决方案

#1


1、映射是相互的,不管是类属性不映射到数据库,还是数据库字段不映射到类属性,不应该是同样的方法可以实现吗?
2、所谓code first就是你可以自己写代码实现。所以不用工具当然是可以的

#2


引用 1 楼 daixf_csdn 的回复:
1、映射是相互的,不管是类属性不映射到数据库,还是数据库字段不映射到类属性,不应该是同样的方法可以实现吗?
2、所谓code first就是你可以自己写代码实现。所以不用工具当然是可以的


感谢您凌晨的回复.
1,实体类属性不映射到数据库字段,标记NotMapped就可以了,如果数据表字段不映射到实体类属性,那是不是就直接不在实体类中写这个属性,或者在自动生成的实体类中删除不需要的属性即可?
这一点我了解的不是很清晰,因为记得EF有个Hash会检查,如果某一端发生变化就会抛异常,但是我测试删除了某个表的字段,貌似EF也没发现.而且更新和查询都是正常的.

2,因为我是现有数据库,所以Code First也是照着现有数据库来写,但只是不能让EF来修改数据库.所以,我就自己写上下文和需要的实体类(a,不是所有表都有对应的实体类;b,不是数据表中所有字段都全部对应的实体类属性,一部分数据表字段因为对实体类没有意义,所以没有写对应的属性).我的理解,您的意思就是,我这样做,是完全可以的.

#3


你的特殊用途的内容应该简历你自己的数据表,不要跟人家的 EF 实体的数据表纠缠在一起。

#4


你要是想“最灵活”,那么当然就是不相互牵制,你的表是你的表、人家的表示人家的表,而不是喜欢相互牵制相互纠缠地去改人家的东西。

#5


引用 4 楼 sp1234 的回复:
你要是想“最灵活”,那么当然就是不相互牵制,你的表是你的表、人家的表示人家的表,而不是喜欢相互牵制相互纠缠地去改人家的东西。


很抱歉,我没有看得很明白您的意思.
我猜测您的意思就是,我可以完全自己写Context和实体类,然后不使用迁移工具,所有改变我自己在数据库和实体类上面手动改.对吗?

#6


@以专业开发人员为伍 
@daixf_csdn 
我自己测试的结果就是,我完全可以自己手写POCO类,手写Context.表和类的修改完全手动在两端修改.这样是可行的,而且我觉得挺好.
当然,迁移工具是不能用的,会出问题,也没打算用.

这个是我在现有数据库上Code First的方法,如果是新项目,完全没必要这么麻烦,手工敲代码毕竟麻烦.当然我会借助Ado.net实体数据模型来辅助(需要手工删除生成的DbContext).

我不是很确定这样是否合适,或者科学.希望有熟悉EF的帮忙指点确认.谢谢.

#7


Code First是根据你的程序代码生成数据库表结构
你既然已经有了数据库表的结构,是不是应该考虑DB First呢?根据表结构生成类,再修改那个文件,去掉多余的字段

#8


问题2,这样做最好,具体问题具体分析

#9


引用 7 楼 From_* 的回复:
Code First是根据你的程序代码生成数据库表结构
你既然已经有了数据库表的结构,是不是应该考虑DB First呢?根据表结构生成类,再修改那个文件,去掉多余的字段


因为EF7只支持Code First了,所以,我就按照Code First来做.而且,我觉得Code First,如果我完全手写Context和实体类的方法可行,那么我觉得Code First其实挺好,灵活啊,想怎么弄就怎么弄.就是发生变化时麻烦一点要两头手工改而已.

#10


引用 8 楼 From_* 的回复:
问题2,这样做最好,具体问题具体分析


再额外请假您一个问题.
我的数据库有很多视图,默认EF会在含有ID的属性上加上Key标识主键.但是我的视图因为都不更新的,仅仅是查询.
我测试过,删除视图对应的实体类中自动生成的Key属性,没有出错,就是我的某些视图对应的实体类,是没有Key的.(按照数据库要求,如果不更新,也是允许没有主键的).但是我并不确定我这样做是否科学.

#11


感谢大家的解答,谢谢  EF 6.x Code First 求教数据库字段不映射到实体类的方法

#12


引用 10 楼 huangbochn 的回复:
Quote: 引用 8 楼 From_* 的回复:

问题2,这样做最好,具体问题具体分析


再额外请假您一个问题.
我的数据库有很多视图,默认EF会在含有ID的属性上加上Key标识主键.但是我的视图因为都不更新的,仅仅是查询.
我测试过,删除视图对应的实体类中自动生成的Key属性,没有出错,就是我的某些视图对应的实体类,是没有Key的.(按照数据库要求,如果不更新,也是允许没有主键的).但是我并不确定我这样做是否科学.
视图像一个表,即使查询,一般也需要主键,要不怎么附加条件,最好保留主键

#13


引用 12 楼 From_* 的回复:
Quote: 引用 10 楼 huangbochn 的回复:

Quote: 引用 8 楼 From_* 的回复:

问题2,这样做最好,具体问题具体分析


再额外请假您一个问题.
我的数据库有很多视图,默认EF会在含有ID的属性上加上Key标识主键.但是我的视图因为都不更新的,仅仅是查询.
我测试过,删除视图对应的实体类中自动生成的Key属性,没有出错,就是我的某些视图对应的实体类,是没有Key的.(按照数据库要求,如果不更新,也是允许没有主键的).但是我并不确定我这样做是否科学.
视图像一个表,即使查询,一般也需要主键,要不怎么附加条件,最好保留主键

明白,非常感谢您的耐心回答.

#1


1、映射是相互的,不管是类属性不映射到数据库,还是数据库字段不映射到类属性,不应该是同样的方法可以实现吗?
2、所谓code first就是你可以自己写代码实现。所以不用工具当然是可以的

#2


引用 1 楼 daixf_csdn 的回复:
1、映射是相互的,不管是类属性不映射到数据库,还是数据库字段不映射到类属性,不应该是同样的方法可以实现吗?
2、所谓code first就是你可以自己写代码实现。所以不用工具当然是可以的


感谢您凌晨的回复.
1,实体类属性不映射到数据库字段,标记NotMapped就可以了,如果数据表字段不映射到实体类属性,那是不是就直接不在实体类中写这个属性,或者在自动生成的实体类中删除不需要的属性即可?
这一点我了解的不是很清晰,因为记得EF有个Hash会检查,如果某一端发生变化就会抛异常,但是我测试删除了某个表的字段,貌似EF也没发现.而且更新和查询都是正常的.

2,因为我是现有数据库,所以Code First也是照着现有数据库来写,但只是不能让EF来修改数据库.所以,我就自己写上下文和需要的实体类(a,不是所有表都有对应的实体类;b,不是数据表中所有字段都全部对应的实体类属性,一部分数据表字段因为对实体类没有意义,所以没有写对应的属性).我的理解,您的意思就是,我这样做,是完全可以的.

#3


你的特殊用途的内容应该简历你自己的数据表,不要跟人家的 EF 实体的数据表纠缠在一起。

#4


你要是想“最灵活”,那么当然就是不相互牵制,你的表是你的表、人家的表示人家的表,而不是喜欢相互牵制相互纠缠地去改人家的东西。

#5


引用 4 楼 sp1234 的回复:
你要是想“最灵活”,那么当然就是不相互牵制,你的表是你的表、人家的表示人家的表,而不是喜欢相互牵制相互纠缠地去改人家的东西。


很抱歉,我没有看得很明白您的意思.
我猜测您的意思就是,我可以完全自己写Context和实体类,然后不使用迁移工具,所有改变我自己在数据库和实体类上面手动改.对吗?

#6


@以专业开发人员为伍 
@daixf_csdn 
我自己测试的结果就是,我完全可以自己手写POCO类,手写Context.表和类的修改完全手动在两端修改.这样是可行的,而且我觉得挺好.
当然,迁移工具是不能用的,会出问题,也没打算用.

这个是我在现有数据库上Code First的方法,如果是新项目,完全没必要这么麻烦,手工敲代码毕竟麻烦.当然我会借助Ado.net实体数据模型来辅助(需要手工删除生成的DbContext).

我不是很确定这样是否合适,或者科学.希望有熟悉EF的帮忙指点确认.谢谢.

#7


Code First是根据你的程序代码生成数据库表结构
你既然已经有了数据库表的结构,是不是应该考虑DB First呢?根据表结构生成类,再修改那个文件,去掉多余的字段

#8


问题2,这样做最好,具体问题具体分析

#9


引用 7 楼 From_* 的回复:
Code First是根据你的程序代码生成数据库表结构
你既然已经有了数据库表的结构,是不是应该考虑DB First呢?根据表结构生成类,再修改那个文件,去掉多余的字段


因为EF7只支持Code First了,所以,我就按照Code First来做.而且,我觉得Code First,如果我完全手写Context和实体类的方法可行,那么我觉得Code First其实挺好,灵活啊,想怎么弄就怎么弄.就是发生变化时麻烦一点要两头手工改而已.

#10


引用 8 楼 From_* 的回复:
问题2,这样做最好,具体问题具体分析


再额外请假您一个问题.
我的数据库有很多视图,默认EF会在含有ID的属性上加上Key标识主键.但是我的视图因为都不更新的,仅仅是查询.
我测试过,删除视图对应的实体类中自动生成的Key属性,没有出错,就是我的某些视图对应的实体类,是没有Key的.(按照数据库要求,如果不更新,也是允许没有主键的).但是我并不确定我这样做是否科学.

#11


感谢大家的解答,谢谢  EF 6.x Code First 求教数据库字段不映射到实体类的方法

#12


引用 10 楼 huangbochn 的回复:
Quote: 引用 8 楼 From_* 的回复:

问题2,这样做最好,具体问题具体分析


再额外请假您一个问题.
我的数据库有很多视图,默认EF会在含有ID的属性上加上Key标识主键.但是我的视图因为都不更新的,仅仅是查询.
我测试过,删除视图对应的实体类中自动生成的Key属性,没有出错,就是我的某些视图对应的实体类,是没有Key的.(按照数据库要求,如果不更新,也是允许没有主键的).但是我并不确定我这样做是否科学.
视图像一个表,即使查询,一般也需要主键,要不怎么附加条件,最好保留主键

#13


引用 12 楼 From_* 的回复:
Quote: 引用 10 楼 huangbochn 的回复:

Quote: 引用 8 楼 From_* 的回复:

问题2,这样做最好,具体问题具体分析


再额外请假您一个问题.
我的数据库有很多视图,默认EF会在含有ID的属性上加上Key标识主键.但是我的视图因为都不更新的,仅仅是查询.
我测试过,删除视图对应的实体类中自动生成的Key属性,没有出错,就是我的某些视图对应的实体类,是没有Key的.(按照数据库要求,如果不更新,也是允许没有主键的).但是我并不确定我这样做是否科学.
视图像一个表,即使查询,一般也需要主键,要不怎么附加条件,最好保留主键

明白,非常感谢您的耐心回答.