我正在寻找一些简单的建议,我似乎无法得到答案(或者我不知道如何提出正确的问题)。
在这里,我有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" }
}
);
我成功添加了一个产品“寿司”,并将其与一个名为“约翰内斯堡”的新经销商联系起来,但是,如何将“电子产品”添加到现有经销商“伦敦”中。什么在??????这样我可以参考现有的经销商吗?
我无法为每种产品创建新的经销商,因为这首先打破了关联表格的目的。
答案 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
});
}
简单来说,这是最简单的解决方案。 谁有更好的方法? 干杯 约翰斯