这可能只是一个简单的初学者的错误,但我似乎无法弄清楚。
我只是尝试开始使用实体框架(ef5.0,.net 4.5),直到现在我一直在滚动我自己的所有sql语句。我首先尝试使用现有的数据库和EF代码,使用两个简单的类,它们具有一对多的关系: clips和clip_ratings (每个剪辑可以有0或多个评分)。课程的有关部分如下:
public class clip
{
public clip()
{
this.Ratings = new List<clip_ratings>();
}
public virtual ICollection<clip_ratings> Ratings { get; set; }
public int clip_id { get; set; }
public Nullable<int> clip_type { get; set; }
// ...
}
public class clip_ratings
{
public int cr_id { get; set; }
public int cr_clip_id { get; set; }
// ...
[ForeignKey("cr_clip_id")]
public clip Clip { get; set; }
}现在,我正在尝试从DB读取一些数据:
var query = from b in db.clips
orderby b.clip_id where b.Ratings.Count > 1
select b;
foreach (var item in query)
{
Console.WriteLine(item.Ratings.Count +" | "+item.clip_linktext);
}查询从DB返回正确的结果集,但是它在item.Ratings.Count上出错。当我只输出item.clip_linktext时,一切都很好,但是对于item.Ratings.Count,我得到了以下错误:
元数据集合中的多个项与标识“剪辑_评级”匹配。
我已经尝试了所有的MS教程,阅读了一些更多的帖子,但似乎无法弄清楚。希望这里有人能在这方面帮助我(而且它很容易修复;)
更新:添加classMap.cs源:
public class clipMap : EntityTypeConfiguration<clip>
{
public clipMap()
{
// Primary Key
this.HasKey(t => t.clip_id);
// ...
// Table & Column Mappings
this.ToTable("clips");
this.Property(t => t.clip_id).HasColumnName("clip_id");
this.Property(t => t.clip_type).HasColumnName("clip_type");
...
}
}
public class clip_ratingsMap : EntityTypeConfiguration<clip_ratings>
{
public clip_ratingsMap()
{
// Primary Key
this.HasKey(t => t.cr_id);
// Table & Column Mappings
this.ToTable("clip_ratings");
this.Property(t => t.cr_id).HasColumnName("cr_id");
this.Property(t => t.cr_clip_id).HasColumnName("cr_clip_id");
// ...
}
}发布于 2012-11-01 21:10:57
好的,在这个简单例子的每一个部分花了一个小时之后,我找到了一个解决方案:显然EF不喜欢这个集合被称为“评级”,尽管DB或任何地方的代码中都没有这个名称的属性/字段/属性。
将名称更改为 name ,而不是Ratings
public clip()
{
this.Votes = new List<clip_ratings>();
}
public virtual ICollection<clip_ratings> Votes { get; set; }一切都很好。
我猜这就是为什么到目前为止我一直回避这种框架的原因,你永远不知道它们在做什么;)
是的,如果我有机会对db进行重新建模,我将尝试遵循命名约定。
如果有人能很好地解释为什么它不适用于评级,我仍然希望听到它,以便能够避免类似的情况在未来。
发布于 2012-11-01 18:47:14
用clip_id和cr_id标记KeyAttribute,用InversePropertyAttribute标记Ratings属性,如下所示:
public class clip
{
public clip()
{
this.Ratings = new List<clip_ratings>();
}
[InverseProperty("Clip")]
public virtual ICollection<clip_ratings> Ratings { get; set; }
[Key]
public int clip_id { get; set; }
public Nullable<int> clip_type { get; set; }
// ...
}
public class clip_ratings
{
[Key]
public int cr_id { get; set; }
public int cr_clip_id { get; set; }
// ...
[ForeignKey("cr_clip_id")]
public clip Clip { get; set; }
}阅读关于代码优先数据注释的文章
PS!认真考虑阅读一般命名公约和姓名指南
https://stackoverflow.com/questions/13183398
复制相似问题