EntityFramework创建一个新对象并将现有对象添加到其导航属性中

时间:2013-04-03 02:36:43

标签: c# navigation entity-framework-5

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

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

public partial class Announcement
    {
        //remove other properties

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

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

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元素。

我无法更改表格结构,所以有什么方法可以做到这一点吗?有些帖子说使用附加方法,但是announcement.Files没有这个方法。 感谢。

2 个答案:

答案 0 :(得分: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"); 
    });
}

其余代码没问题。

答案 1 :(得分:0)

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

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