我有一个非常简单的情况,有2个表
public class Movie
{
[Key]
public Guid ID { get; set; }
public string Name { get; set; }
public byte[] Hash { get; set; }
public int GenreID{ get; set; }
[ForeignKey("GenreID")]
public virtual Genre genre{ get; set; }
}
和
public class Genre
{
public int ID { get; set; }
public string Name { get; set; }
}
现在,在导入序列中,我想创建新电影,并将类型链接到类型表中的现有条目,或者如果它们不存在则创建新的类型条目。
Movie m = new Movie();
m.ID = Guid.NewGuid();
IndexerContext db = new IndexerContext();
var genre = db.Genre.Where(g => g.Name== genreValue).FirstOrDefault();
if(genre!= null)
{
m.GenreID= genre.GenreID;
}
else
{
genre= new Genre();
genre.Name = genreValue;
db.Genres.Add(genre);
var genreCreated= db.Genre.Where(g => g.Name== genreValue).FirstOrDefault();
m.GenreID= genreCreated.GenreID;
}
现在的问题是,它不起作用。最后一行失败,因为genreCreated
为空。
另外我认为我必须做错了 - Entity Framework
可能会有困难。
任何人都可以帮助我吗?
答案 0 :(得分:1)
在add语句之后,您需要保存它: 尝试
genre= new Genre();
genre.Name = genreValue;
db.Genres.Add(genre);
db.SaveChanges();
答案 1 :(得分:1)
db.Genres.Add(genre);
这不会向数据库发送insert语句 - 这指示实体框架在保存更改时应插入新记录。类型将被保存(并且已创建ID可用) 后调用db.SaveChanges()
;至于现在,你没有保存电话,所以genreCreated为空。
在您的情况下 - 修复很简单,您无需从db中选择genreCreated
。只需将m.Genre
设置为新值就可以完成工作
Movie m = new Movie();
m.ID = Guid.NewGuid();
IndexerContext db = new IndexerContext();
var genre = db.Genre.Where(g => g.Name== genreValue).FirstOrDefault();
if(genre! = null)
{
m.GenreID = genre.GenreID;
}
else
{
genre = new Genre();
genre.Name = genreValue;
m.Genre = genre;
}
db.SaveChanges(); //m.GenreID will automatically be set to newly inserted genre