首页 新闻 搜索 专区 学院

EF Code First,怎么处理双向一对一?如果用fluent API应该怎么写

1
悬赏园豆:20 [已解决问题] 解决于 2013-08-20 11:51
 初学EF Code First,请问大家怎么处理双向一对一?如果用fluent API应该怎么写,比如我有一个订单order类和一个派送类deliver,两个表主键都在对方表中充当外键 
chutianshu_1981的主页 chutianshu_1981 | 初学一级 | 园豆:43
提问于:2013-08-13 09:09
< >
分享
最佳答案
1

Entity Framework 实践系列 —— 搞好关系 - 两情相悦(双向一对一)

这里的写法应该是单向的一对一关系。

需要让Code First知道哪个类为主哪个类为辅。如果两端均为Required,不能简单地从多重关系上推测出来。 如果你开始于HasRequired,你会在 WithReuired的位置有两个附加选择:WithRequiredPrincipal 和WithRequiredDependent。选择WithRequiredPrincipal将会使实体配置为主类,意味着该类包含 有关系的主键。选择WithRequiredDependent会使实体配置为辅助类,意味着该类包含有关系的外键。

双向一对一不符合设计,加入第三个表关联双向一对一的两个表?不知能否加入新的表作为辅助。

收获园豆:15
|WinKi| | 小虾三级 |园豆:669 | 2013-08-14 09:20

上面这兄弟的意思是说,除了单向一对一之外,双向一对一就只能是对一个表的拆分那种方式?

比如我上面说的,想要在订单类order和派送类deliver,它们之间需要互相访问,而且是一一对应关系,究竟谁应该是辅助,谁是主体?

chutianshu_1981 | 园豆:43 (初学一级) | 2013-08-14 12:08

@chutianshu_1981: 

我所知道的flunt API只能是这样。order可以作为主类,deliver作为辅助类。按理来说deliver也是根据order来派送的。
你的测试中:提示表中循环 ,是因为那两个配置分别表示 order作为deliver的辅助、deliver作为order的辅助,当然循环了。

|WinKi| | 园豆:669 (小虾三级) | 2013-08-14 13:18
其他回答(1)
0
收获园豆:5
dudu | 园豆:39014 (高人七级) | 2013-08-13 09:13

看过了,用站长的方式在我的项目中会出现一个错误,提示表中循环

支持(0) 反对(0) chutianshu_1981 | 园豆:43 (初学一级) | 2013-08-13 09:21

@chutianshu_1981: 具体错误提示信息是什么?

支持(0) 反对(0) dudu | 园豆:39014 (高人七级) | 2013-08-13 09:55

@dudu: 我已经将类改动了,只记得前两天提示的是在Deliver中生成OrderId会导致循环。

我更改的方式是在Order和Deliver类中删除对方的Id,只保留一个对方的类对象property

使用

modelBuilder.Entity<Order>().HasRequired(o => o.Deliver)
.WithRequiredDependent()
.Map(o => o.MapKey("DeliverId"));
modelBuilder.Entity<Deliver>().HasRequired(d => d.Order)
.WithRequiredDependent()
.Map(d => d.MapKey("OrderId"));

编译通过,而且数据库表也正常了,不过对EntityFramework工作原理还是一知半解,还需要好好看本书。

支持(0) 反对(0) chutianshu_1981 | 园豆:43 (初学一级) | 2013-08-14 12:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册