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,但没有支持当前元素的操作。
我不能改变表结构,所以有什么方法可以做到这一点吗?有些帖子说使用附加方法,但公告。文件没有这个方法。谢谢。
您需要在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/