0

好的。我有有列表的状态。我想拥有多个使用相同系列列表的 State 实例。

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

问题是在我使用 List 创建一个 State 实例之后。如果我创建第二个实例并在其列表中使用相同的系列,则第一个实例将在其列表中丢失该系列。所以很明显 Series 是通过值而不是引用传递的。我是 C# 新手,但在 C++ 中我们会使用指针。这样,如果我更改 Series 的原始值,它将显示在指向它的每个 State 列表中。我还注意到在数据库中的表数据中,它为每个系列添加了一个外键 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])
4

5 回答 5

0

如此处所引用,“ ref关键字导致参数通过引用而不是值传递。”

使用它的丑陋方式如下所示,因为您无法更改 的声明value

public MyClass {
    private string myString;

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

不过,我真的不建议这样做。

于 2013-06-01T23:48:29.877 回答
0

怎么弄成静态的?

public static ICollection<Series> Serieses { get; set; }
于 2013-06-01T23:50:33.760 回答
0

如果您不想为每个实例更改不同的列表,请使用静态列表。您可以像这样访问它。

State.Serieses
于 2013-06-02T00:01:53.547 回答
0

使用AddRange()方法

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

确保在 state 的构造函数Serieses中使用新的空系列进行初始化。

BTW Serieses 不是词。Series的复数形式是Series

更新

我不知道为什么您需要集合的接口并且不能只使用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);
    }
}
于 2013-06-02T00:11:52.063 回答
0

将实体框架与 Code First 一起使用,您还必须将一组状态添加到您的系列中,以便生成多对多关系表。

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

您还必须使用包管理器控制台运行代码优先数据迁移。

Add-Migration <YourMigrationNameHere>

下一次运行应用程序后会产生以下数据库结构:

在此处输入图像描述

于 2013-06-07T15:12:52.340 回答