如何避免将重复项添加到由Seed引起的Entity Framework管理的数据库中?

时间:2017-01-22 13:26:04

标签: c# entity-framework duplicates seed

每次运行应用程序时,都会将相同的对象添加到数据库中(重复)。

我的Configuration.cs:

Save As...

我的KursyInitializer.cs:

namespace SklepInternetowy1.Migrations
{
    using SklepInternetowy1.DAL;
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    public sealed class Configuration : DbMigrationsConfiguration<SklepInternetowy1.DAL.KursyContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
            ContextKey = "SklepInternetowy1.DAL.KursyContext";
        }

        protected override void Seed(SklepInternetowy1.DAL.KursyContext context)
        {
            KursyInitializer.SeedKursyData(context);
            //  This method will be called after migrating to the latest version.

            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            //
        }
    }
}

我的Kurs.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using SklepInternetowy1.Models;
using SklepInternetowy1.DAL;
using SklepInternetowy1.Migrations;
using System.Data.Entity.Migrations;

namespace SklepInternetowy1.DAL
{
    public class KursyInitializer : MigrateDatabaseToLatestVersion<KursyContext, Configuration>
    {
        public static void SeedKursyData(KursyContext context)
        {
            var kategorie = new List<Kategoria>
            {
                new Kategoria() {KategoriaID=1, NazwaKategorii="Asp123",NazwaPlikuIkony="asp.png", OpisKategorii="opis asp net mvc" },
                new Kategoria() {KategoriaID=2, NazwaKategorii="Java",NazwaPlikuIkony="java.png", OpisKategorii="opis java" },
                new Kategoria() {KategoriaID=3, NazwaKategorii="Php",NazwaPlikuIkony="php.png", OpisKategorii="opis php" },
                new Kategoria() {KategoriaID=4, NazwaKategorii="Html",NazwaPlikuIkony="html.png", OpisKategorii="opis html" },
                new Kategoria() {KategoriaID=5, NazwaKategorii="Css",NazwaPlikuIkony="css.png", OpisKategorii="opis css" },
                new Kategoria() {KategoriaID=6, NazwaKategorii="Xml",NazwaPlikuIkony="xml.png", OpisKategorii="opis xml" },
                new Kategoria() {KategoriaID=7, NazwaKategorii="C#",NazwaPlikuIkony="c#.png", OpisKategorii="opis c#" }
             };

            kategorie.ForEach(k => context.Kategorie.AddOrUpdate(k));
            context.SaveChanges();

            var kursy = new List<Kurs>
            {
                new Kurs() {AutorKursu="Tomek", TytulKursu="asp.net mvc1", KategoriaID=1, CenaKursu=100, Bestseller=true, NazwaPlikuObrazka="asd.png", DataDodania=DateTime.Now, OpisKursu="opis1" },
                new Kurs() {AutorKursu="Jacek", TytulKursu="asp.net mvc2", KategoriaID=2, CenaKursu=101, Bestseller=true, NazwaPlikuObrazka="asd1.png", DataDodania=DateTime.Now, OpisKursu="opis2" },
                new Kurs() {AutorKursu="Jarek", TytulKursu="asp.net mvc3", KategoriaID=3, CenaKursu=102, Bestseller=true, NazwaPlikuObrazka="asd2.png", DataDodania=DateTime.Now, OpisKursu="opis3" },
                new Kurs() {AutorKursu="Romek", TytulKursu="asp.net mvc4", KategoriaID=4, CenaKursu=103, Bestseller=true, NazwaPlikuObrazka="asd3.png", DataDodania=DateTime.Now, OpisKursu="opis4" }
            };

             kursy.ForEach(k => context.Kursy.AddOrUpdate(k));
             context.SaveChanges();
        }
    }
}

每次运行应用时,namespace SklepInternetowy1.Models { public class Kurs { public int KursID { get; set; } public int KategoriaID { get; set; } [Required(ErrorMessage = "Wprowadz nazwę kursu")] [StringLength(100)] public string TytulKursu { get; set; } [Required(ErrorMessage = "Wprowadz nazwę autora")] [StringLength(100)] public string AutorKursu { get; set; } public DateTime DataDodania { get; set; } [StringLength(100)] public string NazwaPlikuObrazka { get; set; } public string OpisKursu { get; set; } public decimal CenaKursu { get; set; } public bool Bestseller { get; set; } public bool Ukryty { get; set; } public string OpisSkrocony { get; set; } public virtual Kategoria Kategoria { get; set; } } } 都会添加重复记录:

duplicates

问题:我必须更改哪些内容才能避免表Seed中出现重复内容?

2 个答案:

答案 0 :(得分:1)

您忘记绑定种子方法将检查其是添加还是更新的密钥。

只需更改以下行......

kursy.ForEach(k => context.Kursy.AddOrUpdate(x => x.AutorKursu, k));

我假设&#34; AutorKursu&#34;是你的主要钥匙。您可以根据需要设置此条件。取决于lamda函数种子方法将确定require动作。

来自实体框架doc:

 identifierExpression:
        //     An expression specifying the properties that should be used when determining
        //     whether an Add or Update operation should be performed.

MSDN:https://msdn.microsoft.com/en-us/library/hh846514(v=vs.103).aspx

答案 1 :(得分:0)

AddOrUpdate MSDN文章中所述,此方法使用key属性检查实体是否存在。在您的情况下,整数属性的默认值为0.因此,EF检查是否存在具有此类密钥的记录,并确定它应为该实体创建新记录。 因此,您需要在每个记录的种子方法中明确定义 KursID 属性,以使Entity Framework知道在执行AddOrUpdate时相关项已经存在于数据库中。