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

本文关键字:对象 添加 导航 属性 创建 一个 新对象 EntityFramework | 更新日期: 2023-09-27 18:07:05

我是实体框架5的新手。我试着在网站上搜索,有一些类似的问题,但没有答案。

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

public partial class Announcement
    {
        //remove other properties
        public virtual ICollection<File> Files { get; set; }
    }

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

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,但没有支持当前元素的操作。

我不能改变表结构,所以有什么方法可以做到这一点吗?有些帖子说使用附加方法,但公告。文件没有这个方法。谢谢。

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

您需要在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"); 
    });
}

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

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