2013-05-26 47 views
0

好的。我有國家有列表。我想要有多個使用同一系列列表的State實例。如何使用列表<model>通過引用而不是值?

public class State 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Series> Serieses { get; set; } 
} 

public class Series 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

在國家的名稱輸入,並從列表框選擇1個或多個系列創建狀態後:

public ActionResult Create(State state, FormCollection form) 
    { 

     // method to get selected Series from db 

     foreach (var sItem in seriesModel//List of Possible Series) 
     { 
      foreach (var item in Selections//User selected Series) 
      { 

      if (sItem.Name == item.Name) 
      { 
       newSeries.Add(sItem); 
      } 
      } 
     } 

     state.Serieses = newSeries; 
     _db.Entry(state).State = EntityState.Modified; 
     _db.SaveChanges(); 

的問題是在我創建列表狀態的一個實例。如果我創建第二個實例並在其列表中使用同一個系列,則第一個將在其列表中丟失該系列。所以很明顯,Series是通過值傳遞而不是引用。我是C#的新手,但回到C++我們會使用指針。這樣,如果我更改系列的原始值,它將顯示在指向它的每個州列表上。我也注意到在數據庫的表數據中,它已經爲每個系列添加了一個外鍵State_Id。這是我使用Code First方法時創建的表定義。

CREATE TABLE [dbo].[Series] (
[Id]  INT   IDENTITY (1, 1) NOT NULL, 
[Name]  NVARCHAR (MAX) NULL, 
[State_Id] INT   NULL, 
CONSTRAINT [PK_dbo.Series] PRIMARY KEY CLUSTERED ([Id] ASC), 
CONSTRAINT [FK_dbo.Series_dbo.States_State_Id] FOREIGN KEY ([State_Id]) REFERENCES [dbo].[States] ([Id]) 
+1

是MODELA假設是國家和ModelB假設是系列? – eluxen

+0

是的。一個州有多個系列的清單,其他國家也可以使用。 –

+0

我不明白你爲什麼從列表中失去系列。還有你想過使用'struct'而不是'class'來實現Series。 –

回答

0

使用實體框架與代碼首先,你將有各國的集合添加到您的系列以及以生成框架代碼多對多的關係表。

public class Series 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<State> States { get; set; } 
} 

您將不得不使用包管理器控制檯運行代碼第一次數據遷移。

Add-Migration <YourMigrationNameHere> 

在以下DB結構得到的運行你的應用程序後,下一個:

enter image description here

0

作爲援引here「的裁判關鍵字使一個參數通過引用傳遞,而不是由值」。

醜陋的方式來使用,這將是類似下面的,因爲你不能改變的value聲明:

public MyClass { 
    private string myString; 

    public void SetMyString(ref string str) { 
     myString = str 
    } 
} 

我真的不認爲這雖然。

0

如何使它靜態?

public static ICollection<Series> Serieses { get; set; } 
+1

試過了,導致了94個錯誤。 –

+0

@RichardReniewicki當然有。你不能只是改變它靜態,並期望它自動地罰款。 – Yatrix

+0

我知道,但錯誤,我將不得不改變整個項目來解決。仍然沒有解決我的問題。 –

0

如果您不打算爲每個實例改變列表,請使用靜態列表。你可以像這樣訪問它。

State.Serieses 
0

使用AddRange()方法

//replace 'state.Serieses = newSeries;' with 
state.Serieses.AddRange(newSeries); 

在構造函數中的狀態確保比你有一個新的空系列初始化Serieses

BTW Serieses不是字。 系列的複數是系列

更新

我不知道爲什麼你需要集合接口,不能只用List<Series>。這部分沒有解釋。還有爲什麼virtual

這裏是如何保持相同的收集和使用AddRange()

// StackOverflow 16764155 
public class Series 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class State 
{ 
    public State() 
    { 
     Serieses = new List<Series>(); 
    } 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<Series> Serieses { get; set; } 
} 

public class DbForm 
{ 
    public IEnumerable<Series> Selection { get; } 
} 

public class DbLogic 
{ 

    public void Create(State state, IEnumerable<Series> selection) 
    { 
     state.Serieses.AddRange(selection); 

     // do db stuff 
     // _db.Entry(state).State = EntityState.Modified; 
     // _db.SaveChanges(); 
    } 
} 


class Program 
{ 
    static void Main(string[] args) 
    { 
     var form = new DbForm(); 
     var state = new State(); 
     var db = new DbLogic(); 
     // stuff here 
     var sel = form.Selection; 
     db.Create(state, sel); 
    } 
} 
+0

是的,我知道Serieses不是一個詞,我試圖區分兩者。 –

+0

我也試過使用AddRange(),它不喜歡它。說我錯過了使用指令,不會給我一種方法來添加一個。 –

+0

微軟過去曾使用'SeriesCollection'來區分。 – ja72

相關問題