用EF 6播种相关数据

时间:2015-09-01 11:42:02

标签: entity-framework

我正在寻找一些简单的建议,我似乎无法得到答案(或者我不知道如何提出正确的问题)。

在这里,我有2个类用于使用EF和Code第一种方法构建数据库:

  public class Dealer
{
    public int Id { get; set; }
    public string DealerName { get; set; }
}

 public class Product
{
    public int Id { get; set; }
    public string ProductName { get; set; }
    public Dealer Dealer { get; set; }

}

因此,EF为我创建了一个DB,在Products表中还创建了一个“Dealer-ID(FK,int,null)”字段,以便产品可以与经销商相关。

所以,为了有一个不错的测试应用程序(这是),我想用一些信息为数据库播种。

我创建了一些经销商:

 context.Dealers.AddOrUpdate(
                p => p.DealerName,
                new Models.Dealer { DealerName = "Los Angeles" },
                new Models.Dealer { DealerName = "New York" },
                new Models.Dealer { DealerName = "London" },
                new Models.Dealer { DealerName = "Quebec" },
                new Models.Dealer { DealerName = "Gothenburg" }
            );

现在我想创建一些产品,并将它们同时与经销商联系起来。通常,我只是将一个索引值放入products表中的Dealer_ID外键字段中,但是,因为这首先不在我的模型类中,所以它不可用。 但我确实有一份名单。

像这样:

 context.Products.AddOrUpdate(
            p => p.ProductName,
            new Models.Product { ProductName = "Electronics",
                        Dealer = ???????
            },
            new Models.Product
            {
                ProductName = "Sushi",
                Dealer = new Models.Dealer { DealerName = "Johannesburg" }
            }
            );

我成功添加了一个产品“寿司”,并将其与一个名为“约翰内斯堡”的新经销商联系起来,但是,如何将“电子产品”添加到现有经销商“伦敦”中。什么在??????这样我可以参考现有的经销商吗?

我无法为每种产品创建新的经销商,因为这首先打破了关联表格的目的。

3 个答案:

答案 0 :(得分:0)

将经销商保存在List<Dealer>(或数组)中,并使用列表中的特定索引在Dealer中设置Product属性:

var dealers =new List<Models.Dealer>(){
             new Models.Dealer { DealerName = "Los Angeles" },
             new Models.Dealer { DealerName = "New York" },
             new Models.Dealer { DealerName = "London" },
             new Models.Dealer { DealerName = "Quebec" },
             new Models.Dealer { DealerName = "Gothenburg" },
             new Models.Dealer { DealerName = "Johannesburg" }
        };

context.Dealers.AddOrUpdate(p => p.DealerName,dealers.ToArray());

context.Products.AddOrUpdate(
        p => p.ProductName,
        new Models.Product { ProductName = "Electronics", Dealer = dealers[2]},
        new Models.Product { ProductName = "Sushi",Dealer = dealers[5]});

context.SaveChanges();

答案 1 :(得分:0)

我相信octaviocci得到的是你需要为Dealer属性提供一个值。实体框架将负责填充Dealer_Id。话虽这么说,我建议将您希望在个别变量中引用的任何经销商存储起来,以便您的代码更易于更改并清晰阅读。

var laDealer = new Models.Dealer { DealerName = "Los Angeles" };
var nyDealer = new Models.Dealer { DealerName = "New York" };
var londonDealer = new Models.Dealer { DealerName = "London" };
var quebecDealer = new Models.Dealer { DealerName = "Quebec" };
var gothenburgDealer = new Models.Dealer { DealerName = "Gothenburg" };
var johannesburgDealer = new Models.Dealer { DealerName = "Johannesburg" };
var dealers =new List<Models.Dealer>(){
         laDealer,
         nyDealer,
         londonDealer,
         quebecDealer,
         gothenburgDealer,
         johannesburgDealer
    };
context.Dealers.AddOrUpdate(p => p.DealerName,dealers.ToArray());

我还建议在经销商创建和产品创建之间添加额外的保存。

context.SaveChanges();
context.Products.AddOrUpdate(
        p => p.ProductName,
        new Models.Product { ProductName = "Electronics", Dealer = londonDealer},
        new Models.Product { ProductName = "Sushi",Dealer = johannesburgDealer}
    );  
context.SaveChanges();

我推荐这个,因为我的经验表明,在某些情况下,经销商的保存可能会在产品保存之前执行。这可能会导致外键冲突。 (这可能仅在外键列不可为空时才适用,但我不确定。)

答案 2 :(得分:0)

我正在研究这些类型的解决方案,但我一直在思考&#34;它不应该是这种复杂的#34;。

我最终解决了,而这就是我所做的:

您基本上首先实例化特定经销商,然后将所有产品添加到其中......

  Models.Dealer dealer1 = context.Dealers.Where(e => e.DealerName == "Los Angeles").First();
        context.Products.AddOrUpdate(
            p => p.ProductName,
            new Models.Product
            {
                ProductName = "Electronics",
                Dealer = dealer1
            },
             new Models.Product
             {
                 ProductName = "Gourmet Food",
                 Dealer = dealer1
             },
             new Models.Product
             {
                 ProductName = "Sushi",
                 Dealer = dealer1
             },
             new Models.Product
             {
                 ProductName = "Beach Wear",
                 Dealer = dealer1
             }, new Models.Product
             {
                 ProductName = "Fast Cars",
                 Dealer = dealer1
             });

重要的是要注意,如果您正在执行此操作,那么在添加产品时,将没有经销商提交给数据库,因此您需要实际执行此操作:< / p>

  protected override void Seed(RelatedDataExample.Models.myContext context)
    {


        context.Dealers.AddOrUpdate(
                p => p.DealerName,
                new Models.Dealer { DealerName = "Los Angeles" },
                new Models.Dealer { DealerName = "New York" },
                new Models.Dealer { DealerName = "London" },
                new Models.Dealer { DealerName = "Quebec" },
                new Models.Dealer { DealerName = "Gothenburg" }
            );

        context.SaveChanges();

        Models.Dealer dealer1 = context.Dealers.Where(e => e.DealerName == "Los Angeles").First();
        context.Products.AddOrUpdate(
            p => p.ProductName,
            new Models.Product
            {
                ProductName = "Electronics",
                Dealer = dealer1
            },
             new Models.Product
             {
                 ProductName = "Gourmet Food",
                 Dealer = dealer1
             },
             new Models.Product
             {
                 ProductName = "Sushi",
                 Dealer = dealer1
             },
             new Models.Product
             {
                 ProductName = "Beach Wear",
                 Dealer = dealer1
             }, new Models.Product
             {
                 ProductName = "Fast Cars",
                 Dealer = dealer1
             });

        Models.Dealer dealer2 = context.Dealers.Where(e => e.DealerName == "Quebec").First();
        context.Products.AddOrUpdate(
            p => p.ProductName,
            new Models.Product
            {
                ProductName = "Maple Syrup",
                Dealer = dealer2
            },
             new Models.Product
             {
                 ProductName = "Warm Jackets",
                 Dealer = dealer2
             },
             new Models.Product
             {
                 ProductName = "Fermented Fish Head",
                 Dealer = dealer2
             });

    }

简单来说,这是最简单的解决方案。 谁有更好的方法? 干杯 约翰斯