我是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没有这个方法。 感谢。
答案 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查询。您可以使用以下链接构建表达式树: