实体框架:添加记录和相关数据

时间:2014-04-15 10:56:45

标签: asp.net sql asp.net-mvc database entity-framework

我有一个非常简单的情况,有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可能会有困难。

任何人都可以帮助我吗?

2 个答案:

答案 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