这可能只是一些简单的初学者的错误,但我似乎无法弄明白。
我只是试图开始使用实体框架(ef 5.0,.net 4.5),直到现在才滚动我所有的sql语句。我首先尝试使用现有的数据库和EF代码,使用两个具有一对多关系的简单类:clip和clip_ratings(每个剪辑可以有零个或多个等级)。课程的相关部分是:
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; }
}
现在我正在尝试从数据库中读取一些数据:
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);
}
查询从数据库返回正确的结果集,但是它在item.Ratings.Count上出错。当我输出item.clip_linktext时一切都很好,但是使用item.Ratings.Count我得到以下错误:
元数据集合中的多个项目与标识'clip_ratings'匹配。
我已经尝试过关注所有MS EF教程并阅读更多帖子,但似乎无法弄明白。希望有人可以帮助我解决这个问题(并且很容易解决;))
更新:添加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");
// ...
}
}
答案 0 :(得分:2)
将clip_id
和cr_id
标记为KeyAttribute
,将Ratings
标记为InversePropertyAttribute
,如下所示:
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; }
}
答案 1 :(得分:1)
将名称更改为投票而非评分更改为
public clip()
{
this.Votes = new List<clip_ratings>();
}
public virtual ICollection<clip_ratings> Votes { get; set; }
一切正常。
猜猜这就是为什么到目前为止我已经避免使用这种框架,你真的不知道他们在幕后做了什么;)
是的,如果我有机会重新构建数据库,我将尝试遵循命名约定。
如果有人能够很好地解释为什么它不能与评级合作,我仍然希望听到它,以便能够在将来避免类似情况。