我正在使用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 {
}
};
}
}
}
答案 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
欢迎任何扩展功能的建议。