【问题标题】:Does not contain a definition for "Add"不包含“添加”的定义
【发布时间】:2013-12-18 02:04:41
【问题描述】:

我正在尝试在this 线程中做同样的事情,但我收到了错误:

“System.Collections.Generic.IEnumerable”不包含“Add”的定义,并且找不到接受“System.Collections.Generic.IEnumerable”类型的第一个参数的扩展方法“Add”(您是否缺少using 指令还是程序集引用?)

这是我的代码:

[HttpPost]
public ActionResult Create(ANIME anime)
{
    var db = new MainDatabaseEntities();
    var newanime = new ANIME
    {
        ID_AN = anime.ID_AN,
        TITLE_OR = anime.TITLE_OR,
        TITLE_EN = anime.TITLE_EN,
        GENRES = new List<GENRES>()
    };

    foreach (var selectedAnime in anime.GENRES.Where(c => c.isSelected))
    {
        var genre = new GENRES { ID_GE = selectedAnime.ID_GE };
        db.GENRES.Attach(genre);
        newanime.GENRES.Add(genre); <--- this is the error line
    }

    db.ANIME.Add(newanime);
    db.SaveChanges();
    return RedirectToAction("Index");
}

动漫:

public partial class ANIME
{
    public int ID_AN { get; set; }
    public string TITLE_OR { get; set; }
    public string TITLE_EN { get; set; }

    public virtual IEnumerable<GENRES> GENRES { get; set; }
}

类型:

public partial class GENRES
{
    public int ID_GE { get; set; }
    public string GENRE { get; set; }
    public bool isSelected { get; set; }
    public virtual ICollection<ANIME> ANIME { get; set; }
}

错误出现在HttpPost 中的newanime.GENRES.Add(genre) 行中。我在所有模型和控制器中添加了using System.Linq,但它没有帮助。任何想法如何解决这个问题?

编辑:

修复此问题后,出现了一个新错误。我认为它与上述无关,但我不想发送不必要的线程。

错误信息:

无法在 LINQ to Entities 查询中构造实体或复杂类型“MainDatabaseModel.GENRES”。

相关代码:

public ActionResult Create()
{
    var db = new MainDatabaseEntities();
    var viewModel = new ANIME
    {
        GENRES = db.GENRES.Select(c => new GENRES
        {
            ID_GE = c.ID_GE,
            GENRE = c.GENRE,
            isSelected = false
        }).ToList()
    };
    return View(viewModel);       
}

【问题讨论】:

  • 这篇文章解释了更多你的问题stackoverflow.com/questions/1210295/…
  • @Satpal:Linq 中也没有 .Add 方法; IEnumerables 无法修改。
  • 您链接到的问题将IEnumerable 用于视图模型。您正在使用您的 Entity Framework 实体 作为视图模型(我在之前的问题中警告过您),您不能将该逻辑应用为模型 require ICollection for navigation properties that are one-to-many relations。只需将IEnumerable&lt;T&gt; 更改为ICollection&lt;T&gt;
  • 如果我可以问,为什么你的属性/类有奇怪的命名约定?在C#中,我们对属性、方法和类型使用Pascal Case,对字段使用camelCase(一般不暴露)

标签: c# asp.net-mvc entity-framework asp.net-mvc-4


【解决方案1】:

试试这个:

public partial class ANIME
{

    public int ID_AN { get; set; }
    public string TITLE_OR { get; set; }
    public string TITLE_EN { get; set; }

    public virtual ICollection<GENRES> GENRES { get; set; } // Use ICollection here
}

【讨论】:

  • 好的,它有帮助......我一开始有它,但我改为 IEnumerable 因为我对 toList() 有一些问题,但现在一切正常。嗯,很奇怪,谢谢你的帮助。
  • ToList() 有什么问题?
  • @Placek ICollection 是比 IEnumerable 更“丰富”的接口。详情请查看此问题:stackoverflow.com/questions/10113244/…
  • 修复此错误后出现新错误;_;。请参阅第一篇文章中的编辑。
  • @Placek 你真的需要发一个新帖子——因为新答案很长。简短的回答:您不能在 linq to 实体中构造 GENRE,您需要将其投影为匿名类型,然后才构造 GENRE 对象(通过这种类型,您已经在 linq to 对象中)。代码:GENRES = db.GENRES.Select(c => new{ ID_GE = c.ID_GE,GENRE = c.GENRE,isSelected = false }).ToList().Select(g => new GENRE {.... ..}).ToList()
【解决方案2】:

您有一个使用列表初始化的 IEnumerable 属性。 List 类实现了 IEnumerable 接口。

当你调用这样的东西时:

IEnumerable myList = new List<MyType>();

您是说您希望您的对象具有IEnumerable 接口的功能,这些功能也在List 类中继承。在这种情况下,方法 Add 不是 IEnumerable 接口的一部分,因为它只是 List 类的方法,而您有这个例外。

然后,您必须将属性类型从 IEnumerable&lt;YourType&gt; 更改为 IList&lt;YourType&gt;(有关 IList here 的更多信息)。这样就不会抛出Add方法的异常了。

【讨论】:

    【解决方案3】:

    IEnumerable&lt;&gt; 只是一个项目序列。您不能向其中添加项目,也不能从中删除项目。可以查询。

    如果您需要添加项目,您将需要一个至少实现ICollection&lt;&gt; 接口或IList&lt;&gt; 接口的集合。

    好消息是你可以像下面这样使用IEnumerable&lt;&gt;

    var list = new List<GENRES>();
    var newanime = new ANIME
    {
        ID_AN = anime.ID_AN,
        TITLE_OR = anime.TITLE_OR,
        TITLE_EN = anime.TITLE_EN,
        GENRES = list
    };
    
    list.Add(genre);
    

    但这有有限的可能性。一旦离开范围并失去对本地 list 变量的引用,您将无法添加新项目。

    【讨论】:

      【解决方案4】:

      第二个问题的答案是您不能(也不应该)投影到映射实体上。但是,您可以投影到匿名类型或数据传输对象上。

      看到这个帖子: The entity cannot be constructed in a LINQ to Entities query

      另外,请不要在未来用一个全新的、未实现的问题来扩展您的初始问题。这让人很难跟上...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多