0

SO、私は私のefモデルの次の初期化子を持っています。

簡単にするために、1 つの車両、1 つの顧客、1 つの住所エンティティがあります。1 つのメソッドで Address エンティティを作成しました。ここで、Customer エンティティを作成する必要がありますが、既存のオブジェクトに Address 値を割り当てるにはどうすればよいでしょうか?

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

            }
        }
4

2 に答える 2

1

EF Code First では、親エンティティで子エンティティのリストを宣言する 2 つのエンティティ間の関係を宣言する必要があります。

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

次に、ChildEntity を作成する場合:

var newChild = new ChildEntity();

そして、それを親エンティティのリストに追加します:

parentEntity.ChildEntities.Add(newChild);

親エンティティがコンテキスト内にある場合、newChild は自動的にコンテキスト内に置かれ、変更をウェーブすると、変更をデータベースに保存する前に子の必要なプロパティ (FK プロパティ) が newChild に設定されます。

答えは、単純に親のリストに追加することです。

実際、この関係は次の 3 つの方法で表されます。

  • 親の子エンティティのリスト
  • 親を指す子エンティティのプロパティ
  • FK (エンティティに含めることも含めないこともできます)

コンテキストで作業している場合、3 つのプロパティのいずれかを変更すると、それに応じて他のプロパティがコンテキストで修正されます。

したがって、答えには、他のプロパティの変更が含まれる場合があります。

于 2012-05-08T13:26:39.237 に答える
0

2つのオプションがあります:(ラムダ式とは関係ありません;)

  1. BuildCustomers内部から呼び出すことができますBuildAdresses

    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()各入力関数の最後に呼び出すことを忘れないでください。このようにして、エンティティは、渡すオブジェクトがテーブルの要素であることを認識します。

どちらのソリューションも同じことを行いますが、読みやすさは異なります。

于 2012-05-08T13:08:28.290 に答える