Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 与EF 6相关的播种数据_Entity Framework - Fatal编程技术网

Entity framework 与EF 6相关的播种数据

Entity framework 与EF 6相关的播种数据,entity-framework,Entity Framework,我在寻找一些简单的建议,我似乎无法得到答案(或者我不知道如何提出正确的问题) 接下来,我有两个类用于使用EF和代码优先方法构建db: public class Dealer { public int Id { get; set; } public string DealerName { get; set; } } 及 因此,EF为我创建了一个DB,并且在Products表中还创建了一个“经销商ID(FK,int,null)”字段,以便产品可以与经销商相关 因此,为了有一个好

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

接下来,我有两个类用于使用EF和代码优先方法构建db:

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

因此,EF为我创建了一个DB,并且在Products表中还创建了一个“经销商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外键字段中输入一个索引值,但是,由于这个值最初不在我的models类中,所以它不可用。 不过,我确实有一份清单

像这样:

 context.Products.AddOrUpdate(
            p => p.ProductName,
            new Models.Product { ProductName = "Electronics",
                        Dealer = ???????
            },
            new Models.Product
            {
                ProductName = "Sushi",
                Dealer = new Models.Dealer { DealerName = "Johannesburg" }
            }
            );
我成功地添加了一个产品“Sushi”,并将其与一个名为“约翰内斯堡”的新经销商关联,但是,例如,如何将“电子产品”添加到现有经销商“伦敦”中。里面有什么??????以便我可以参考现有经销商


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

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

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();
var交易商=新列表(){
新车型。经销商{DealerName=“Los Angeles”},
新车型。经销商{DealerName=“纽约”},
新车型。经销商{DealerName=“London”},
新车型。经销商{DealerName=“魁北克”},
新车型。经销商{DealerName=“Gothenburg”},
新车型。经销商{DealerName=“约翰内斯堡”}
};
Dealers.AddOrUpdate(p=>p.DealerName,deralers.ToArray());
context.Products.AddOrUpdate(
p=>p.ProductName,
新型号。产品{ProductName=“Electronics”,经销商=经销商[2]},
新型号。产品{ProductName=“Sushi”,经销商=经销商[5]});
SaveChanges();

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

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();
var交易商=新列表(){
新车型。经销商{DealerName=“Los Angeles”},
新车型。经销商{DealerName=“纽约”},
新车型。经销商{DealerName=“London”},
新车型。经销商{DealerName=“魁北克”},
新车型。经销商{DealerName=“Gothenburg”},
新车型。经销商{DealerName=“约翰内斯堡”}
};
Dealers.AddOrUpdate(p=>p.DealerName,deralers.ToArray());
context.Products.AddOrUpdate(
p=>p.ProductName,
新型号。产品{ProductName=“Electronics”,经销商=经销商[2]},
新型号。产品{ProductName=“Sushi”,经销商=经销商[5]});
SaveChanges();

我相信octaviocci的意思是,您需要为经销商财产提供价值。实体框架将负责填充经销商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());

我建议这样做,因为我的经验表明,在某些情况下,经销商的保存可能不会在产品保存之前执行。这可能会导致外键冲突。(这可能只适用于外键列不可为空的情况,但我不确定。)

我相信octaviocci的意思是,您需要为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());

我建议这样做,因为我的经验表明,在某些情况下,经销商的保存可能不会在产品保存之前执行。这可能会导致外键冲突。(这可能只适用于外键列不可为空的情况,但我不确定。)

我正在研究这些类型的解决方案,但我一直在想“不应该这么复杂”

我最终解决了这个问题,以下是我所做的:

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

  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
             });
但需要注意的是,如果您正在这样做,在添加产品时,还没有经销商向DB承诺,因此您需要实际这样做:

  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
             });

    }
在我看来,这是最简单的解决办法。 谁有更好的办法? 干杯
约翰

我一直在寻找这些类型的解决方案,但我一直在想“不应该这么复杂”

我最终解决了这个问题,以下是我所做的:

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

  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
             });
但需要注意的是,如果您正在这样做,在添加产品时,还没有经销商向DB承诺,因此您需要实际这样做:

  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
             });

    }
在我看来,这是最简单的解决办法。 谁有更好的办法? 干杯
约翰

这看起来也是一个不错的解决方案。我喜欢这个+1这看起来也是一个很好的解决方案。我喜欢这个+1.