【问题标题】:how to add new type to an existing class or object in asp.net mvc如何将新类型添加到asp.net mvc中的现有类或对象
【发布时间】:2017-01-29 17:03:57
【问题描述】:

我想为从 Microsoft MVC 中的数据库表(带有实体框架类)获取的现有类(对象?)添加一个新类型。 IE: 我的人类 {f_name, l_name} 当我循环抛出它时,如何向这个对象添加新类型? 喜欢:

// Person class stracture is:
public Person()
{
    public string f_name { get; set; }
    public string l_name { get; set; }
}

我想在不添加模型的情况下添加“年龄”

var all_persons = db.Person.toList();
for (var item in all_person)
{
    item.age = some_value;
}
return View(all_persons);

【问题讨论】:

  • 你要添加什么类型?
  • 您需要创建另一个模型(可以从包含属性int agePerson 派生),然后将您的查询投影到它。
  • 我不想将新属性(此处的年龄)保存在我的模型(和数据库表)中,只想用它显示额外的动态值
  • 向我们展示您想做什么作为示例... 键入您认为它会的代码,虽然它不起作用,所以我们可以看到动态值,因为它有点棘手。我想建议使用 Select(p => new...) 但我不确定你在问什么。
  • public class PersonVM : Person { public int Age { get; set; } }var all_persons = db.Person.Select(x => new PersonVM{ f_name = x.f_name, l_name = x.l_name, age = number });,你的观点是@model IEnumerable<PersonVM> - 但是number 的值从哪里来?

标签: c# asp.net-mvc


【解决方案1】:

Person 类中添加[NotMapped](假设您不希望将此属性映射到数据库):

[NotMapped]
public int Age {get; set;}

或者直接创建视图模型而不是使用EF模型

【讨论】:

    【解决方案2】:

    使用实体框架的示例:

    如果您使用的是代码优先的方法,那么 [NotMapped] 将适合您。

    但是,如果您使用的是模型优先方法,那么它将不起作用,因为如果您要更新模型,它将根据模型的 .tt 模板进行更新,并创建一个只有表中的属性的类。

    那么,现在呢?这里出现了部分类的概念。

    从 EF 生成的模型:

    namespace EF.Model
    {
       public partial class Person
       {
           public string f_name { get; set; }
           public string l_name { get; set; }
       }
    }
    

    因此,添加您不希望 EF 在 CRUD 操作时映射的其他属性。在同一个项目中添加一个新的部分类,与 EF 模型具有相同的类名和相同的命名空间

    namespace EF.Model
    {
           public partial class Person
           {
               public string fullName { get; set; }
               public int age { get; set; }
           }
    }
    

    所以现在你可以这样做了。

    var all_persons = db.Person.toList();
    for (var item in all_person)
    {
        item.age = some_value;
        item.fullName = item.f_name + item.l_name;
    }
    return View(all_persons);
    

    我希望这能让你更好地理解。你应该阅读部分类。 https://www.dotnetperls.com/partial

    【讨论】:

      【解决方案3】:

      您可以在 linq Select 中添加新属性,如下所示:

          void AddNewField(int number)
          {
              var all_persons = new db.Person.Select(x => new { x.f_name, x.l_name, age = number });
              return View(all_persons);
          }
      

      这将使您不必将新字段实际添加到模型中。

      【讨论】:

      • 我只想返回新数据而不是保存或更改基本 Person 类。
      • 更新年龄时它不会保存在您的数据库中,除非您指定这样做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      相关资源
      最近更新 更多