Lambda 表达式和实体框架,如何获取对在另一个方法中创建的对象的引用
本文关键字:另一个 方法 创建 引用 对象 获取 框架 实体 表达式 何获取 Lambda | 更新日期: 2023-09-27 18:33:34
所以,我的 ef 模型有以下初始化器。
为了简化起见,我有一个车辆,一个客户,一个地址实体。我在一种方法中创建了地址实体。现在我需要创建客户实体,但如何将地址值分配给现有对象?
public class DevelopmentInitializer
{
/// <summary>
/// This class allows the database tables to be created and seed at runtime.
/// </summary>
public class AskAndTrackInitializer : DropCreateDatabaseAlways<AskAndTrackContext>
{
/// <summary>
/// This fills the database with sample data to start with
/// </summary>
/// <param name="context">DBContext required for the connection</param>
protected override void Seed(AskAndTrackContext context)
{
BuildDealers(context);
BuildRequesters(context);
BuildAddresses(context);
BuildCustomers(context);
BuildVehicles(context);
BuildWorkflowsBase(context);
}
private void BuildDealers(AskAndTrackContext context)
{
var dealer1 = new Dealer {DealerId = 1, Name = "Dealer 1"};
var dealer2 = new Dealer { DealerId = 2, Name = "Dealer 2" };
var dealer3 = new Dealer { DealerId = 3, Name = "Dealer 3" };
var dealer4 = new Dealer { DealerId = 4, Name = "Dealer 4" };
var dealer5 = new Dealer { DealerId = 5, Name = "Dealer 5" };
context.Dealers.Add(dealer1);
context.Dealers.Add(dealer2);
context.Dealers.Add(dealer3);
context.Dealers.Add(dealer4);
context.Dealers.Add(dealer5);
}
/// <summary>
/// Requesters test data
/// </summary>
private void BuildRequesters(AskAndTrackContext context)
{
var requester1 = new Requester {EmailAddress = "le.xx@hotmail.com", Name="Andres x", RequesterId=1};
var requester2 = new Requester { EmailAddress = "le.xxx@hotmail.com", Name = "Andres y", RequesterId = 2 };
var requester3 = new Requester { EmailAddress = "le.yyy@hotmail.com", Name = "Juan l", RequesterId = 3 };
var requester4 = new Requester { EmailAddress = "le.zzzz@hotmail.com", Name = "Peter x", RequesterId = 4 };
var requester5 = new Requester { EmailAddress = "le.aaaa@hotmail.com", Name = "Patrick z", RequesterId = 5 };
context.Requesters.Add(requester1);
context.Requesters.Add(requester2);
context.Requesters.Add(requester3);
context.Requesters.Add(requester4);
context.Requesters.Add(requester5);
}
/// <summary>
/// Workflow base test data and its related objects
/// </summary>
private void BuildWorkflowsBase(AskAndTrackContext context)
{
}
/// <summary>
/// Vehicle test data
/// </summary>
private void BuildVehicles(AskAndTrackContext context)
{
//var vehicle1
}
/// <summary>
/// Customers test data
/// </summary>
private void BuildCustomers(AskAndTrackContext context)
{
//var customer1 = new Customer{Address = ???
}
private void BuildAddresses(AskAndTrackContext context)
{
var address1 = new Address
{
AddressId = 1,
Box = "71",
City = "Antwerp",
Number = "1",
Street = "Belgielei",
Zip = "2018"
};
var address2 = new Address
{
AddressId = 2,
Box = "21",
City = "Antwerp",
Number = "1",
Street = "Lange Leemstraat",
Zip = "2018"
};
var address3 = new Address
{
AddressId = 3,
Box = "23",
City = "Antwerp",
Number = "1",
Street = "Lamoriniestraat",
Zip = "2018"
};
var address4 = new Address
{
AddressId = 4,
Box = "24",
City = "Antwerp",
Number = "1",
Street = "De Keyserlei",
Zip = "2000"
};
var address5 = new Address
{
AddressId = 5,
Box = "34",
City = "Antwerp",
Number = "1",
Street = "Italialei",
Zip = "2020"
};
context.Addresses.Add(address1);
context.Addresses.Add(address2);
context.Addresses.Add(address3);
context.Addresses.Add(address4);
context.Addresses.Add(address5);
}
}
在 EF Code First 中,必须声明两个实体之间的关系,以声明部分实体中的子实体列表
public List<ChildeEntity> ChildEntities { get; set; }
然后,如果创建子实体:
var newChild = new ChildEntity();
并将其添加到父实体的列表中:
parentEntity.ChildEntities.Add(newChild);
如果父实体位于上下文中,则 newChild 将自动放入上下文中,并且,当您挥手更改时,将在将更改保存到数据库之前在 newChild 中设置子实体的必要属性(FK 属性(。
所以,答案是:只需将其添加到父级列表中即可。
事实上,这种关系以 3 种方式表示:
- 父实体的子实体列表
- 子实体中指向父实体的属性
- FK(可以包含在实体中,也可以不包含(
工作,则每当更改 3 个属性中的任何一个时,其他属性都会相应地在上下文中更正。
因此,答案可以包括更改任何其他属性。
我看到两个选项:(与lambda表达式无关;)
-
您可以从
BuildAdresses
内部呼叫BuildCustomers
;private void BuildAddresses(AskAndTrackContext context) { var listAddress = new List<Address>(); // create adresses, populate listAdress with the Address objects. BuildCustomers(AskAndTrackContext context, listAddress); }
-
BuildAdresses
可以返回 ID 列表,并将该列表作为参数传递给BuildCustomers
。List<Address> addresses = BuildAddresses(context); BuildCustomers(context, addresses);
不要忘记在每个填充函数的末尾调用context.SaveChanges()
。这样,实体将知道您传递的对象是表中的元素。
两种解决方案将执行相同的操作,但可读性将不同。