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

Lambda 表达式和实体框架,如何获取对在另一个方法中创建的对象的引用

在 EF Code First 中,必须声明两个实体之间的关系,以声明部分实体中的子实体列表

public List<ChildeEntity> ChildEntities { get; set; }

然后,如果创建子实体:

var newChild = new ChildEntity();

并将其添加到父实体的列表中:

parentEntity.ChildEntities.Add(newChild);

如果父实体位于上下文中,则 newChild 将自动放入上下文中,并且,当您挥手更改时,将在将更改保存到数据库之前在 newChild 中设置子实体的必要属性(FK 属性(。

所以,答案是:只需将其添加到父级列表中即可。

事实上,这种关系以 3 种方式表示:

  • 父实体的子实体列表
  • 子实体中指向父实体的属性
  • FK(可以包含在实体中,也可以不包含(
如果您在上下文中

工作,则每当更改 3 个属性中的任何一个时,其他属性都会相应地在上下文中更正。

因此,答案可以包括更改任何其他属性。

我看到两个选项:(与lambda表达式无关;)

  1. 您可以从BuildAdresses内部呼叫BuildCustomers;

    private void BuildAddresses(AskAndTrackContext context)
    {
        var listAddress = new List<Address>();
        // create adresses, populate listAdress with the Address objects. 
        BuildCustomers(AskAndTrackContext context, listAddress);
    }
    
  2. BuildAdresses可以返回 ID 列表,并将该列表作为参数传递给 BuildCustomers

    List<Address> addresses = BuildAddresses(context);
    BuildCustomers(context, addresses);
    

不要忘记在每个填充函数的末尾调用context.SaveChanges()。这样,实体将知道您传递的对象是表中的元素。

两种解决方案将执行相同的操作,但可读性将不同。