2012-05-08 28 views
0

SO,我有我的ef模型的以下初始化程序。Lambda表達式和實體框架,如何獲取對另一個方法創建的對象的引用

爲了簡化,我有一個車輛,一個客戶,一個地址實體。 我用一種方法創建了地址實體。 現在我需要創建客戶實體,但是如何將地址值分配給現有對象?

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 = "[email protected]", Name="Andres x", RequesterId=1}; 
       var requester2 = new Requester { EmailAddress = "[email protected]", Name = "Andres y", RequesterId = 2 }; 
       var requester3 = new Requester { EmailAddress = "[email protected]", Name = "Juan l", RequesterId = 3 }; 
       var requester4 = new Requester { EmailAddress = "[email protected]", Name = "Peter x", RequesterId = 4 }; 
       var requester5 = new Requester { EmailAddress = "[email protected]", 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); 

      } 
     } 
+0

lol我認爲這與lambda表達式無關,還是它呢? –

+0

您是首先使用EF代碼還是EDM模型?請根據您的選擇選擇相應的課程或EDM模型。 – JotaBe

+0

是EF代碼優先。 –

回答

1

在EF代碼首先,你必須聲明兩個實體在partent實體宣告孩子的實體的列表之間的關係

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

然後,如果你創建一個ChildEntity:

var newChild = new ChildEntity(); 

和您將其添加到父實體列表中:

parentEntity.ChildEntities.Add(newChild); 

如果父母en tity在上下文中,newChild將自動置於上下文中,並且當您發生更改時,在將更改保存到數據庫之前,將在newChild中設置子項的必要屬性(FK屬性)。

所以,答案是:只需將其添加到父級的列表。

其實關係可表示有3種方式:

  • 父母的兒童實體
  • 在指向父
  • 一個FK子實體屬性的列表(可是否包含在實體中)

如果您在上下文中工作,則無論何時更改3個屬性中的任何一個,都會相應地更正其他屬性。

所以答案可以包括更改任何其他屬性。

0

我看到兩個選項:(沒有無關lambda表達式;)

  1. 您還可以從內部BuildAdressesBuildCustomers;

    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()在每個填充功能的結束。這樣Entity會知道你傳遞的對象是表中的一個元素。

兩種解決方案都會做同樣的事情,但可讀性會有所不同。

+0

是的,但是如何將對象地址的引用分配給對象客戶實例? –

+0

查看quoation標記?在我的代碼上了解這個問題。 –

+0

啊,好吧:首先我看到你需要在一系列的「添加」命令後面使用'context.SaveChanges()'。通過這種方式,您可以將項目添加到數據庫,並且如果您引用該對象,Entity就會明白它是數據庫中的一個元素。看我的編輯! –

相關問題