C# 为什么我的数据重复?(ASP.Net Mvc)

C# 为什么我的数据重复?(ASP.Net Mvc),c#,asp.net-mvc,C#,Asp.net Mvc,我试着在Asp net Mvc中学习一些东西,但我遇到了一个问题。 我希望每次启动程序时数据不会重复。 我认为它会工作得很好,我的数据会在第一次运行时创建。为什么不工作呢 存储上下文: namespace StoreProject.DAL { using StoreProject.Models; using System; using System.Data.Entity; using System.Linq; public class StoreCon

我试着在Asp net Mvc中学习一些东西,但我遇到了一个问题。 我希望每次启动程序时数据不会重复。 我认为它会工作得很好,我的数据会在第一次运行时创建。为什么不工作呢

存储上下文:

namespace StoreProject.DAL
{
    using StoreProject.Models;
    using System;
    using System.Data.Entity;
    using System.Linq;

    public class StoreContext : DbContext
    {
        public StoreContext()
            : base("name=StoreDb")
        {
        }
        static StoreContext()
        {
            Database.SetInitializer<StoreContext>(new StoreInitializer());
        }

        public virtual DbSet<Product> Products { get; set; }
    }

}
namespace StoreProject.DAL
{
使用StoreProject.Models;
使用制度;
使用System.Data.Entity;
使用System.Linq;
公共类StoreContext:DbContext
{
公共存储上下文()
:base(“name=StoreDb”)
{
}
静态StoreContext()
{
SetInitializer(newstoreInitializer());
}
公共虚拟数据库集产品{get;set;}
}
}
Storeinitializer:



namespace StoreProject.DAL
{
    public class StoreInitializer : MigrateDatabaseToLatestVersion<StoreContext, Configuration>
    {
        public static void SeedStoreData(StoreContext context)
        {
            var products = new List<Product>
            {
                new Product(){Name = "Chockolate1",Price = 2.20f, Country = "Russia"},
                new Product(){Name = "Chockolate2", Price=3.30f, Country = "Poland"},

            };
            products.ForEach(a => context.Products.AddOrUpdate(a));

            context.SaveChanges();
        }
    }
}

名称空间StoreProject.DAL
{
公共类存储初始值设定项:MigrateDatabaseToLatestVersion
{
公共静态void SeedStoreData(StoreContext上下文)
{
var产品=新列表
{
新产品(),
新产品(),
};
products.ForEach(a=>context.products.AddOrUpdate(a));
SaveChanges();
}
}
}
迁移文件夹中的配置

using System.Collections.Generic;
using StoreProject.DAL;
using StoreProject.Models;

namespace StoreProject.Migrations
{

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

        protected override void Seed(StoreProject.DAL.StoreContext context)
        {
            StoreInitializer.SeedStoreData(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.
        }
    }
}


使用System.Collections.Generic;
使用StoreProject.DAL;
使用StoreProject.Models;
名称空间StoreProject.Migrations
{
公共密封类配置:dbmigrionsconfiguration
{
公共配置()
{
AutomaticMiggerationsEnabled=假;
ContextKey=“StoreProject.DAL.StoreContext”;
}
受保护的覆盖无效种子(StoreProject.DAL.StoreContext上下文)
{
StoreInitializer.SeedStoreData(上下文);
//迁移到最新版本后将调用此方法。
//您可以使用DbSet.AddOrUpdate()助手扩展方法
//避免创建重复的种子数据。
}
}
}

您没有给它一个键/键组合来进行比较,因此您传入的所有内容都是一个Add操作

products.ForEach(product => context.Products.AddOrUpdate(p => new {p.Name, p.Country},  product));

您没有给它一个键/键组合来进行比较,所以您传入的所有内容都是一个Add操作

products.ForEach(product => context.Products.AddOrUpdate(p => new {p.Name, p.Country},  product));

好吧,这很有效。这就是我所说的。我认为现在最好是添加一个新的迁移,并在“up”方法类型的sql代码中插入一个新的数据。你觉得怎么样?抱歉我的英语。老实说……我个人认为DB-First方法只值得在概念验证场景中使用。它真的很酷,但我从未见过它在扩展到一个团队或在生产环境中运行的任何时间内都会有好的结局。某些人或事总是会把设置搞得一团糟,如果你快速部署的话,这会让你非常害怕。更不用说,如果你有幸拥有DB成员的话,它真的会将他们拒之门外。我只是不太相信DB,甚至对最佳实践或指导意见都没有有效的意见。希望我能帮上更多的忙…很好,很好。这就是我所说的。我认为现在最好是添加一个新的迁移,并在“up”方法类型的sql代码中插入一个新的数据。你觉得怎么样?抱歉我的英语。老实说……我个人认为DB-First方法只值得在概念验证场景中使用。它真的很酷,但我从未见过它在扩展到一个团队或在生产环境中运行的任何时间内都会有好的结局。某些人或事总是会把设置搞得一团糟,如果你快速部署的话,这会让你非常害怕。更不用说,如果你有幸拥有DB成员的话,它真的会将他们拒之门外。我只是不太相信DB,甚至对最佳实践或指导意见都没有有效的意见。希望我能更多的帮助。。。