有三个表:
TableA:
ID
TableB:
AID
CID
TableC:
ID
AID
他们的关系是:
TableA是分类表,TableC是数据表,C通过字段CID确定该数据所属的主分类。
TableB是一个多对多的关系表,定义A与C之间的多对多关系(C中的数据除了主要所属分类外,还可能归类为别的分类)。
当我把这些表拖拽到EF设计器后,发现表TableB被A与C之间的多对多关系取代了,这样A与C之间就有了1对多和多对多两重关系。
请问下,这个情状是否会影响到应用?我是通过T4生成代码的,计划走CodeFirst的路(现在还没弄)。
SELECT a.guid, a.title, a.link, a.pubDate, a.author, a.source, a.category, a.description FROM RSSNews a INNER JOIN RSSNewsCategoryRelative b ON a.guid = b.guid INNER JOIN ProductCategory c ON b.Category = c.Category WHERE c.Category=@category and a.guid>@guid and mininews=0 and a.status=1 UNION SELECT a.guid, a.title, a.link, a.pubDate, a.author, a.source, a.category, a.description FROM RSSNews a INNER JOIN RSSNewsCategoryRelative b ON a.guid = b.guid INNER JOIN ProductCategory c ON b.Category = c.Parent WHERE c.Category=@category and a.guid>@guid and mininews=0 and a.status=1 UNION SELECT a.guid, a.title, a.link, a.pubDate, a.author, a.source, a.category, a.description FROM RSSNews a LEFT JOIN RSSNewsCategoryRelative b ON a.guid = b.guid WHERE (b.Category='ALL' or a.Category='ALL') and a.guid>@guid and mininews=0 and a.status=1 ORDER BY a.pubDate desc
上面的SQL是我曾经的实现,现在要用EF的LINQ来实现,该怎么弄?
RSSNews就是TableC
RSSNewsCategoryRelative就是TableB
ProductCategory就是TableA
CodeFirst的核心是Code First, 你现在是Database First的思路。
Enity Framework 是ORM,是“对象关系”与“数据库关系”之间的映射工具。
Code First 是先设计对象,在设计对象(实体类以及它们之间的关系)时忘掉数据库,设计好之后,然后用EF将之映射到数据库。
忘掉TableA, TableB, TableC, 根据你的domain,设计对象。
实体A与实体C就是多对多关系,用EF处理多对多关系是最轻松的。
那我的那一段SQL语句换成LINQ后该怎么写?
@笨笨蜗牛: 无法用EF生成同样的SQL语句,只能想办法得到想要的查询结果。前几天,我想用EF实现纯正的两个表的INNER JOIN查询都无法实现,最后只能改用ADO.NET。复杂查询不是EF的优势。
给B表加一个主键之后,B表应该就能自动生成了
关系表只两个字段,AID和CID,主键是这两个字段联合的。
@笨笨蜗牛: 用联合主键的这种肯定B表不会有实体,你加一个id,作主键的话,应该是就可以了。
@笨笨蜗牛: 你这个RSSNewCategoryRelative里只有guid和Category两个字段?