替代 Group_Concat 自定义现有的实体框架模型
Posted
技术标签:
【中文标题】替代 Group_Concat 自定义现有的实体框架模型【英文标题】:Substitute for Group_Concat to customize existing Entity Framework model 【发布时间】:2012-02-28 09:06:03 【问题描述】:我正在使用带有连接表的多对多数据库,通过外键连接主数据表。
http://img12.imageshack.us/img12/6500/databasew.png
使用我的数据表示,需要将几行从属表字段(例如 Genres.name)连接到数据绑定网格的一个单元格中。
书名 |流派
一些书|小说;恐怖;谜团
对于这个数据集,我将这个 SQL 查询与 GROUP_CONCAT 一起用于此目的:
SELECT Books.ID, Books.BOOKTITLE, GROUP_CONCAT(Genres.name, '; ') As Gen
FROM Books INNER JOIN
Books_Genres ON Books.ID = Books_Genres.book_id INNER JOIN
Genres ON Books_Genres.genre_id =Genres.id
GROUP BY Books.ID
由于我现在转向 EF4 并且对它非常陌生,因此我不知道如何实现可以在带有实体的数据网格中显示的相同结果表。应该对 Entity 模型进行哪些更改才能获得相同的结果?
非常感谢任何帮助!
更新:
我有一个由数据库(Model1.edmx & Model1.Designer.cs)生成的实体模型。我需要编辑 Model1.edmx(xml 文件)吗?一些分步说明将有很大帮助。我刚开始 EF4,对我来说都是希腊语。 :)
我做了一个自定义类:
public partial class Book
[EdmScalarProperty(EntityKeyProperty = false, IsNullable = true)]
[DataMember()]
public global::System.String GenresConcatenated
get return string.Join("; ", Genres.Select(g => g.name));
set
private List<Genre> Genres get; set;
现在我可以访问 IDE IntelliSense 中的 GenresConcatenated 属性,但是当我运行应用程序时会抛出错误:
概念类型“MyNamespace.Book”中的成员数 与对象侧类型的成员数不匹配 'MyNamespace.Common.Book'。确保成员的数量是 一样。
看起来像:
...EntityDataSource 不支持部分自定义属性 类。它只返回模型中的实体。 (Binding custom property in Entity Framework)
所以我回到第一方。 :)
【问题讨论】:
不要更新任何自动生成的内容。 EF 生成的所有类都是部分的。创建您自己的Book
类的部分部分并添加自定义属性连接流派,如 @Bas 所示。
感谢您的提示,Ladislav,将尝试这样做。这个新属性在我尝试绑定到数据网格的数据源表中是否可用?
【参考方案1】:
怎么样,
class Book
public int ID get; set;
public string Title get; set;
public List<Genre> Genres get; set;
public string Gen
get
return string.Join("; ", Genres.Select(g => g.Name));
然后绑定到 Book.Gen(或任何你想命名的名字)
【讨论】:
我做了属性,如何绑定到Book.Gen? 您需要了解何时/如何从数据库中提取数据。如果将基础数据作为每个流派的单独查询(往返)提取,则此解决方案的性能/扩展性将非常差。原始存储过程是到数据库的单次往返以获取所有数据。因此它具有最佳性能。以上是关于替代 Group_Concat 自定义现有的实体框架模型的主要内容,如果未能解决你的问题,请参考以下文章