C# ASP.NET实体框架插入(如果不存在)

C# ASP.NET实体框架插入(如果不存在),c#,asp.net,sql-server,entity-framework,azure,C#,Asp.net,Sql Server,Entity Framework,Azure,嘿,小伙子们,姑娘们:) 我目前正在尝试实现一个c#/asp.net代码first entityframework数据库应用程序(在azure上),该应用程序将保存一个电影列表。每次我向应用程序索要电影时,它都会执行以下操作: 查询数据库 如果在数据库中找不到,则查询TMDB 添加到数据库(无重复项) 我有一个工作的查询,我有一个工作的TMDB解析器,我可以向数据库添加东西。当我试图在我的关系中没有重复项时,问题就出现了 我的设置: 电影 public partial class Movies

嘿,小伙子们,姑娘们:)

我目前正在尝试实现一个c#/asp.net代码first entityframework数据库应用程序(在azure上),该应用程序将保存一个电影列表。每次我向应用程序索要电影时,它都会执行以下操作:

  • 查询数据库
  • 如果在数据库中找不到,则查询TMDB
  • 添加到数据库(无重复项)
  • 我有一个工作的查询,我有一个工作的TMDB解析器,我可以向数据库添加东西。当我试图在我的关系中没有重复项时,问题就出现了

    我的设置:

    电影

    public partial class Movies
        {
            public Movies() { this.Genres = new HashSet<Genres>(); /* [...] */ }
    
            [Key]
            public int Movie_ID { get; set; }
            // [...]
            public virtual ICollection<Genres> Genres { get; set; }
        }
    
    public partial class Genres
    {
        public Genres() { }
    
        [Key]
        public int Genre_ID { get; set; }
        public string Genre_Name { get; set; }
    }
    
    数据库访问类

    public partial class Movies
        {
            public Movies() { this.Genres = new HashSet<Genres>(); /* [...] */ }
    
            [Key]
            public int Movie_ID { get; set; }
            // [...]
            public virtual ICollection<Genres> Genres { get; set; }
        }
    
    public partial class Genres
    {
        public Genres() { }
    
        [Key]
        public int Genre_ID { get; set; }
        public string Genre_Name { get; set; }
    }
    

    ==>这里是我的问题出现的地方首先,您需要将
    公共虚拟ICollection电影{get;set;}
    添加到您的流派类中,以确保多对多关系

    编辑

    此外,我还看到您同时拥有
    db
    dataBaseContext
    ,这是错误的。 您必须使用相同的数据库上下文

    我认为这样做应该奏效:

    Movies daMov = new Movies();
    // [...]
    foreach ( string genre in movieGenres )
            {
                Genres daGenre = await db.Genres.FirstOrDefaultAsync(
                       m => m.Genre_Name == genre);
    
                // doesn't exist - firstOrDefault() returns default
                if ( daGenre == null || object.Equals(daGenre, default(Genres)))               
                {
                    daGenre = new Genres(); // create new in db
                    daGenre.Genre_Name = genre;
                }
                daMov.Genres.Add( daGenre );
                db.Movies.Add(daMov);
                await db.SaveChangesAsync();
    
            }
    

    版权所有©1990-2014 IMDb.com,Inc。。。。你有他们的书面许可来删除他们的网站吗?在此之前,您可能只是在浪费时间(好吧,直到他们决定阻止您的刮板):)不完全:(例外消息:“检测到类型为'dotNETproject1.WebAPI.Movies'。路径为'Genres[0].Movies'的自引用循环。”Asmodiel,你还在处理循环问题吗?什么时候会出现这个错误?.Net比序列化程序更能原谅关系循环。如果你正在进行Json或Javascript序列化,你可以用[ScriptIgnore]或[JsonIgnore]来修饰属性。这不是“如果不存在则插入”行为。这是“选择并插入”行为。它在高度并发的环境中不起作用。