每次运行应用程序时,都会将相同的对象添加到数据库中(重复)。
我的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; }
}
}
都会添加重复记录:
问题:我必须更改哪些内容才能避免表Seed
中出现重复内容?
答案 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时相关项已经存在于数据库中。