9

尝试首先利用实体框架和代码在 ASP.NET Web 应用程序中播种数据。我将此代码放在Seed()Configuration.cs 文件的方法中。现在我正在研究解决方案的地址方面,我正在尝试将所有州和县加载到系统中。

这是我的状态代码,工作得很好......

context.StateProvinces.AddOrUpdate(
    p => p.Abbreviation,
    new StateProvince { Abbreviation = "AL", Name = "Alabama" },
    new StateProvince { Abbreviation = "AK", Name = "Alaska" },
    new StateProvince { Abbreviation = "AZ", Name = "Arizona" },
    ....
);

我该如何使用该AddOrUpdate()功能context.Counties?这就是我的County对象的样子。

public class County
{
    public int CountyId { get; set; }
    public int StateProvinceId { get; set; }
    public String Name { get; set; }

    [ForeignKey("StateProvinceId")]
    public virtual StateProvince StateProvince { get; set; }
}

虽然我可以简单地复制我对州所做的格式,但我们知道县名在全国范围内重复使用。所以我不能简单地c => c.Name用作现有的检查。我可以使用名称和 StateProvinceId 字段吗?

4

2 回答 2

8

为什么不将县添加到州,而不是反过来呢?

如果您不能这样做,那么您可以将您的修改为以下内容:

var al = new StateProvince { Abbreviation = "AL", Name = "Alabama" },
var ak = new StateProvince { Abbreviation = "AK", Name = "Alaska" },
var ar = new StateProvince { Abbreviation = "AZ", Name = "Arizona" },

context.StateProvinces.AddOrUpdate(
    p => p.Abbreviation,
    al,
    ak,
    ar
);

context.SaveChanges();

context.Counties.Add(new County() { Name = "Something", StateProvince = al });

// DONT CALL SAVE, Initializer needs something to do or it complains
于 2013-07-19T21:29:55.607 回答
2

您必须使用 OnModelCreating() 方法并声明一个包含县名和州缩写的复合键。您还需要您的县实体上的属性作为缩写。

这是一个带有示例的代码片段:

public class DirectMailDbContext : DbContext, IDirectMailDbContext
{
    public DbSet<BulkQualificationCriteria> QualificationRanges { get; set; }
    public DbSet<CarrierRouteDefinition> RouteDefinitions { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer(new DirectMailDbContextDropInitializer());

        modelBuilder.Entity<BulkQualificationCriteria>().HasKey(q => new {q.QualificationLevel, q.MatchType});  // <- Define composite primary key here
        modelBuilder.Entity<CarrierRouteDefinition>()
                    .HasKey(c => new {c.Zip, c.RouteNumber});

        base.OnModelCreating(modelBuilder);
   }

来自 OP

public class County
{
    public int CountyId { get; set; }
    public int StateProvinceId { get; set; }
    public String Name { get; set; }
    [ScaffoldColumn(false)]
    public String StatePostalAbbreviation { get; set; }

    [ForeignKey("StateProvinceId")]
    public virtual StateProvince StateProvince { get; set; }
}

种子

context.Counties.AddOrUpdate(
    c => new {c.StatePostalAbbreviation, c.Name},
    new County { Name = "Aleutians East", StatePostalAbbreviation = "AK" },
    new County { Name = "Aleutians West", StatePostalAbbreviation = "AK" },
    ....
);

OnModelCreating

modelBuilder.Entity<County>().HasKey(q => new { q.Name, q.StatePostalAbbreviation }); 
于 2013-07-19T21:44:18.200 回答