EF Code First ,复杂类型的嵌套泛型问题

hztltgg 2015-06-01 03:03:42
代码如下,vb要是不习惯,我就换成c#


Public Class Job

<Key>
Public Property Id As Guid

Public Property Prop As Para

End Class

Public Class Para

Public Property BigArg1 As Para1(Of Integer?)
Public Property BigArg2 As Para2

End Class

<ComplexType>
Public Class Para1(Of T1)

Public Property Arg As T1

End Class

<ComplexType>
Public Class Para2

Public Property Arg As Integer?

End Class


不能生成BigArg1,能生成 BigArg2 ,不知道能不能解决。

...全文
486 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
software_artisan 2015-06-03
  • 打赏
  • 举报
回复
引用 14 楼 hztltgg 的回复:
[quote=引用 13 楼 xuanbg 的回复:] [quote=引用 11 楼 hztltgg 的回复:] 其实这个业务需求就是填写一个表,但这个表是个不规范 的二维表,每一行一个参数,同一列的类型是不一样的,甚至同一列有的是需要填写长宽这种非原子的数据,如果全部按照数据库的来,拆分后对用户填写的习惯改动太大,而且我还需要每行计算一个分数,拆开后计算也复杂了。 之前用继承的也试过,因为还有泛型 的嵌套,当时也是试了不行,现在是发现不出现泛型还是可以实现嵌套的,就是需要每嵌套 的一层都需要通过继承给他包装一次
像这种问题,其实根本就不是问题!每行的参数类型不一样,不能加一个参数类型字段么?非原子数据不能拆成原子数据用更多行来存储么?用户习惯就更扯淡了,只要你用户界面不变,用户还会关心你存成什么样?怎么计算的? [/quote] 用EF Code First 就是想不要去关注数据库的实现,将每行抽象成一个类,每行可以计算一个分值,尽量接近领域模型,而不是数据库的范式,如果完全基于数据库来开发的话,好像失去Code First的优势了。[/quote] 你这样想没错,可是,楼主你要先搞清楚你的领域模型呀!你连业务的数据模型都没法正确建立,就去想用泛型去做抽象是不是有些……好吧,我也套用sp大神的话:别滥用泛型,不要过度设计
hztltgg 2015-06-02
  • 打赏
  • 举报
回复
引用 13 楼 xuanbg 的回复:
[quote=引用 11 楼 hztltgg 的回复:] 其实这个业务需求就是填写一个表,但这个表是个不规范 的二维表,每一行一个参数,同一列的类型是不一样的,甚至同一列有的是需要填写长宽这种非原子的数据,如果全部按照数据库的来,拆分后对用户填写的习惯改动太大,而且我还需要每行计算一个分数,拆开后计算也复杂了。 之前用继承的也试过,因为还有泛型 的嵌套,当时也是试了不行,现在是发现不出现泛型还是可以实现嵌套的,就是需要每嵌套 的一层都需要通过继承给他包装一次
像这种问题,其实根本就不是问题!每行的参数类型不一样,不能加一个参数类型字段么?非原子数据不能拆成原子数据用更多行来存储么?用户习惯就更扯淡了,只要你用户界面不变,用户还会关心你存成什么样?怎么计算的? [/quote] 用EF Code First 就是想不要去关注数据库的实现,将每行抽象成一个类,每行可以计算一个分值,尽量接近领域模型,而不是数据库的范式,如果完全基于数据库来开发的话,好像失去Code First的优势了。
hztltgg 2015-06-02
  • 打赏
  • 举报
回复
引用 13 楼 xuanbg 的回复:
[quote=引用 11 楼 hztltgg 的回复:] 其实这个业务需求就是填写一个表,但这个表是个不规范 的二维表,每一行一个参数,同一列的类型是不一样的,甚至同一列有的是需要填写长宽这种非原子的数据,如果全部按照数据库的来,拆分后对用户填写的习惯改动太大,而且我还需要每行计算一个分数,拆开后计算也复杂了。 之前用继承的也试过,因为还有泛型 的嵌套,当时也是试了不行,现在是发现不出现泛型还是可以实现嵌套的,就是需要每嵌套 的一层都需要通过继承给他包装一次
像这种问题,其实根本就不是问题!每行的参数类型不一样,不能加一个参数类型字段么?非原子数据不能拆成原子数据用更多行来存储么?用户习惯就更扯淡了,只要你用户界面不变,用户还会关心你存成什么样?怎么计算的? [/quote] 用EF Code First 就是想不要去关注数据库的实现,将每行抽象成一个类,每行可以计算一个分值,尽量接近领域模型,而不是数据库的范式,如果完全基于数据库来开发的话,好像失去Code First的优势了。
software_artisan 2015-06-02
  • 打赏
  • 举报
回复
引用 11 楼 hztltgg 的回复:
其实这个业务需求就是填写一个表,但这个表是个不规范 的二维表,每一行一个参数,同一列的类型是不一样的,甚至同一列有的是需要填写长宽这种非原子的数据,如果全部按照数据库的来,拆分后对用户填写的习惯改动太大,而且我还需要每行计算一个分数,拆开后计算也复杂了。 之前用继承的也试过,因为还有泛型 的嵌套,当时也是试了不行,现在是发现不出现泛型还是可以实现嵌套的,就是需要每嵌套 的一层都需要通过继承给他包装一次
像这种问题,其实根本就不是问题!每行的参数类型不一样,不能加一个参数类型字段么?非原子数据不能拆成原子数据用更多行来存储么?用户习惯就更扯淡了,只要你用户界面不变,用户还会关心你存成什么样?怎么计算的?
本拉灯 2015-06-01
  • 打赏
  • 举报
回复
hztltgg 2015-06-01
  • 打赏
  • 举报
回复
引用 10 楼 sp1234 的回复:
另外,你在标题中写着“EF Code First”。我不使用EF,不太清楚EF Code First是否能够自动创建上述的“主表-扩展表”以及外键关联。但是原则上应该是这样用关系数据库的机制来对应类型的“父->子”关系的。
EF里是可以实现主表扩展表的功能,但由于我这个功能里扩展表的字段类型是不一样的,处理起来也麻烦的吧。 其实这个业务需求就是填写一个表,但这个表是个不规范 的二维表,每一行一个参数,同一列的类型是不一样的,甚至同一列有的是需要填写长宽这种非原子的数据,如果全部按照数据库的来,拆分后对用户填写的习惯改动太大,而且我还需要每行计算一个分数,拆开后计算也复杂了。 之前用继承的也试过,因为还有泛型 的嵌套,当时也是试了不行,现在是发现不出现泛型还是可以实现嵌套的,就是需要每嵌套 的一层都需要通过继承给他包装一次
  • 打赏
  • 举报
回复
另外,你在标题中写着“EF Code First”。我不使用EF,不太清楚EF Code First是否能够自动创建上述的“主表-扩展表”以及外键关联。但是原则上应该是这样用关系数据库的机制来对应类型的“父->子”关系的。
  • 打赏
  • 举报
回复
也就是说在扩展表中必须要重复父类的那些字段 --> 也就是说在扩展表中不需要要重复父类的那些字段 打错了字了,意思就错了。sorry。
  • 打赏
  • 举报
回复
引用 3 楼 hztltgg 的回复:
[quote=引用 1 楼 sp1234 的回复:] 你应该单独声明为一个类型,它继承自Para1(Of Integer?)。
试了下,这样是可以,但这样和BigArg2 就没有区别了,甚至更麻烦,都是要对每个类型重新定义一个类。 因为有一个表,是保存工程参数的,有很多要验证的值,这些值的类型不相同,比如接地值是一个浮点数,空间又是一个长乘宽乘高的三个浮点值表示,还有些是钢筋根数,是整数表示。 所以,我想是用三个泛型来实现,Para1(Of T1),Para1(Of T1,T2),Para1(Of T1,T2,T3) 这样就只需要定义三个类型,否则每个类型都需要定义一个类的话,各种类型的排列组合就多了,而且也不方便维护了。 [/quote] 不要脱离业务来空洞地搞过分抽象的玩意儿。 不同类型的对象,可以通过一个“基础表”与每一个类型的“扩展表”的外键关联来表示扩展关系(也就是说在扩展表中必须要重复父类的那些字段)。这是直截了当的做法,而不是搞过分抽象的玩意儿。 在普通的编程中,我们强调强类型,避免弱类型、避免滥用反射,就是这个道理。不能因为要描述扩展,就用低级的组合来代替继承关系。
hztltgg 2015-06-01
  • 打赏
  • 举报
回复
引用 6 楼 xuanbg 的回复:
楼主你想多了。。。长宽高难道不是用3个字段去存么?你的类成员属性把长宽高3个属性整一块了?
数据库里是三个字段,但有些参数比如接地电阻是一个值,我是想将一个参数的和三个参数的在程序里作为同一个基类的派生类来处理。
software_artisan 2015-06-01
  • 打赏
  • 举报
回复
楼主你想多了。。。长宽高难道不是用3个字段去存么?你的类成员属性把长宽高3个属性整一块了?
hztltgg 2015-06-01
  • 打赏
  • 举报
回复
引用 4 楼 starfd 的回复:
你就一张表,还整个泛型干啥……
虽然是一个表,但重复的很多,表的字段很多,不处理一下的话很难维护的 比如,一个长宽高参数,有设计施工监理验收四个人输入数据,每个人要输入长宽高,那就是12个字段,有60多个这样的参数,有的是两个值的,有的是一个值的,值的类型也不一样。
  • 打赏
  • 举报
回复
你就一张表,还整个泛型干啥……
hztltgg 2015-06-01
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
你应该单独声明为一个类型,它继承自Para1(Of Integer?)。
试了下,这样是可以,但这样和BigArg2 就没有区别了,甚至更麻烦,都是要对每个类型重新定义一个类。 因为有一个表,是保存工程参数的,有很多要验证的值,这些值的类型不相同,比如接地值是一个浮点数,空间又是一个长乘宽乘高的三个浮点值表示,还有些是钢筋根数,是整数表示。 所以,我想是用三个泛型来实现,Para1(Of T1),Para1(Of T1,T2),Para1(Of T1,T2,T3) 这样就只需要定义三个类型,否则每个类型都需要定义一个类的话,各种类型的排列组合就多了,而且也不方便维护了。
  • 打赏
  • 举报
回复
你这个是要弄泛型类么? 据说,EF 的Code First目前还不支持泛型…… http://zhidao.baidu.com/link?url=LcPYz7PcuKNONbEr6-kIoyz6evIK6vhDNW_0aYvw24CcFZzyc34KOjPx4TdqAhQobL-aJHtFBsxlA9oW72Piiq
  • 打赏
  • 举报
回复
你应该单独声明为一个类型,它继承自Para1(Of Integer?)。

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧