Entity framework 与EF 6相关的播种数据
我在寻找一些简单的建议,我似乎无法得到答案(或者我不知道如何提出正确的问题) 接下来,我有两个类用于使用EF和代码优先方法构建db: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)”字段,以便产品可以与经销商相关 因此,为了有一个好
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.