0

我是 Entity Framework 5 的新手。我尝试在网站中搜索,有一些类似的问题但没有答案。

我有一个 Announcement 对象并有导航属性 Files

public partial class Announcement
    {
        //remove other properties

        public virtual ICollection<File> Files { get; set; }
    }

在sql server中有Announcement表,File表和AnnouncementFiles表只有[AnnouncementId]和[FileId]两个字段。情景是:我创建了一个新的公告,但所有文件都已经存在于数据库中。代码在这里:

public void CreateAnnouncement(Announcement announcement, List<Guid> fileIds)
        {
            using (var db = new MyDbEntities())
            {
                var files = db.Files.Where(f => fileIds.Contains(f.Id));
                db.Announcements.Add(announcement);
                foreach (var file in files)
                {
                    announcement.Files.Add(file);
                }
                db.SaveChanges();
            }
        }

并且出现类似(我的.net框架不是英文的)无法更新EntitySet“AnnouncementFiles”的错误,因为它有一个DefiningQuery,但没有支持currnet元素的操作。

我无法更改表结构,那么有什么办法吗?一些帖子说使用附加方法,但公告。文件没有这种方法。谢谢。

4

2 回答 2

1

您需要在 DbContext 的OnModelCreating方法中定义链接表。

您应该查找使用 FluentApi 在实体框架中定义多对多关系。代码看起来像这样

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  base.OnModelCreating(modelBuilder);

  modelBuilder.Entity<Annoucement>()
    .HasMany(x => x.Files)
    .WithMany(x => x.Announcements)
    .Map(x => { 
      x.ToTable("AnnouncementFiles"; 
      x.MapLeftKey("AnnouncementID"); 
      x.MapRightKey("FileID"); 
    });
}

您的其余代码都很好。

于 2013-04-03T03:04:07.577 回答
0

fileIds.Contains(f.id) 无法转换为 sql 查询。您可以使用此链接构建表达式树:

http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/095745fe-dcf0-4142-b684-b7e4a1ab59f0/

于 2013-04-03T03:05:20.303 回答