生成样本数据

时间:2013-11-06 12:36:46

标签: c# entity-framework asp.net-mvc-4 database-migration sample-data

我正在使用ASP.NET MCV4,EF6,Code-First模型开展学校项目。现在,我想知道如何用数据填充数据库。我检查了migrations,但我不想搞乱db结构。我只是想插入数据,我试过这个:

namespace Autokereskedes.Models
{
    public class _SampleData : DropCreateDatabaseIfModelChanges<AutoDb>
    {
        protected override void Seed(AutoDb context)
        {
            new Autokereskedes.Models.SampleData.Users().List().ForEach(u=>context.Users.Add(u));

            new Autokereskedes.Models.SampleData.Cars().List().ForEach(c => context.Cars.Add(c));

        }
    }
}

namespace Autokereskedes.Models.SampleData
{
    public class Users
    {
        public List<User> List()
        {
            var crypto = new SimpleCrypto.PBKDF2();
            var salt = Autokereskedes.Controllers.AccountController.PasswordSalt;
            return new List<User> 
            {
                new User { 
                    UserId = Guid.NewGuid(), 
                    Email = "admin@autoker.hu", 
                    Password = crypto.Compute("admin",salt),
                    Phone = "+36 20 XXX YYZZ",
                    Banned = false,
                    Country = "Hungary",
                    City = "Szeged",
                    Street = "DivisonByZero street 1/0",
                    ZipCode = 1100,
                    RegistrationDate = DateTime.Now
                },
                new User { 
                    UserId = Guid.NewGuid(), 
                    Email = "user@autoker.hu", 
                    Password = crypto.Compute("user",salt),
                    Phone = "+36 20 XXX YYZZ",
                    Banned = false,
                    Country = "Hungary",
                    City = "Szeged",
                    Street = "DivisonByZero street 2/0",
                    ZipCode = 1100,
                    RegistrationDate = DateTime.Now
                }
            };
        }
    }
}
我认为这是有效的。但是我应该如何插入具有外键的数据?我看到了一个教程,他们在所有List&lt;&gt; -s中使用了单个文件,在外键字段中使用了这样的内容:Genre = genres.Single(g => g.Name == "Jazz")。我现在无法复制它。

namespace Autokereskedes.Models.SampleData
{
    public class Cars
    {
        public List<Car> List()
        {
            return new List<Car>
            {
                new Car {
                    CarId = Guid.NewGuid(),
                    DepoId = now what
                },
                new Car {

                }
            };
        }
    }
}

3 个答案:

答案 0 :(得分:2)

当您为数据设定种子时,您需要考虑最终的外键关系。

return new List<Car>
{
    new Car {
        CarId = Guid.NewGuid(),
        DepoId = now what // it depends, is this a required relationship?
    },
    new Car {
    }
};

如果DepoId是一个可选关系,你可以等到你有一个Depo&amp;在设置此属性之前DepoId。否则,如果需要,则需要在将其插入上下文之前进行设置。

protected override void Seed(AutoDb context)
{
    new Autokereskedes.Models.SampleData.Users().List()
        .ForEach(u=>context.Users.Add(u));
    var cars = new Autokereskedes.Models.SampleData.Cars().List();
    var depos = new Autokereskedes.Models.SampleData.Depos().List();
    foreach (var car in cars)
    {
        car.DepoId = depos.FirstOrDefault(x => x.DepoId == ...?);

        context.Cars.Add(car);
    }
}

我想问题是,你如何决定应该为每辆车分配哪些depo?

另一种方法,因为你的Depo实体是一个依赖项,你需要首先解决它们,就是将你的depos传递给你的汽车列表方法:

var depos = new Autokereskedes.Models.SampleData.Depos().List();
depos.ForEach(d => context.Depos.Add(d));
//context.SaveChanges(); no need for this since your id's are Guid's
var cars = new Autokereskedes.Models.SampleData.Cars().List(depos);

public List<Car> List(IEnumerable<Depo> depos)
{
    // now you have depos to look for id's in
    return new List<Car>
    {
        new Car {
            CarId = Guid.NewGuid(),
            DepoId = depos.SingleOrDefault(x => [your predicate]),
        },
        new Car {
        }
    };
}

答案 1 :(得分:0)

该过程称为“播种”数据。

您创建初始化对象并覆盖Seed方法:

public class MyDataContextDbInitializer : DropCreateDatabaseIfModelChanges<MyDataContext>
{
   protected override void Seed(MagazineContext context)
   {
     context.Customers.Add(new Customer() { CustomerName = "Test Customer" });
   }
} 

这是一篇描述如何操作的文章: http://www.codeproject.com/Articles/315708/Entity-Framework-Code-First-Data-Initializers

答案 2 :(得分:0)

我制作了一个Nuget包,因此您可以生成随机联系人数据(名字,姓氏,城市,邮政编码,生日,帐号等)

在此版本中,您可以导出为CSV,XML,JSON和SQL。

打开Visual Studio,管理Nuget包 在线搜索:

DSharp FrameWork:ContactGenerator

欢迎任何扩展功能的建议。