【问题标题】:Can't create controller properly with Entity Framework无法使用实体框架正确创建控制器
【发布时间】:2023-04-02 20:58:02
【问题描述】:

所以这里是一个快速的概述。我正在使用 Code First,新数据库。

如您所见,我创建了一个 AccountModels 模型(与默认名称相同,以防任何人感到困惑)。如下所示:

public class User
{
    public int UserId { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }
    public virtual ICollection<Stat> Stats { get; set; }
}

public class Stat
{
    public int StatId { get; set; }
    public string Age { get; set; }
    public string Height { get; set; }
    public string Weight { get; set; }
    public bool Sex { get; set; }

    public int UserId { get; set; }
    public virtual User User { get; set; }
}

public class BodylogDbContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Stat> Stats { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<BodylogDbContext>(null);
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    }
}

现在,当我尝试添加控制器时,我无法选择我的模型类 AccountModel。我记得,我应该能够选择模型类,然后在下一个字段中选择我的数据上下文类 - BodylogDbContext (Bodylog.Models),并且应该设置所有内容。但我不能,为什么?

这是我的连接字符串。

   <add name="BodylogDbContext"
   connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\Bodylog.mdf;Integrated Security=True"
   providerName="System.Data.SqlClient"
/>

【问题讨论】:

  • 对我来说看起来不错。 AccountModels 看起来只是文件名而不是类名。下拉菜单将显示公共类名称。 StatUser 在那里。您希望下拉列表中的内容是什么?
  • 我在想它应该显示 AccountModels?对我来说,我必须选择UserStat 似乎是错误的,因为它们相同,如果你明白我的意思吗?嗯:/
  • “相同”是什么意思?抱歉,我不太明白你的意思。 ;) 放置类的物理文件与代码的编译方式无关。在这种情况下,编译后,c# 不知道您的 AccountModels.cs 文件。下拉列表显示已编译程序集的反射视图。

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


【解决方案1】:

这里一切正常。这里的问题之一是在示例项目中,提供了一个名为 AccountModels.cs 的文件,其中包含多个模型类。约定规定这些实际上被拆分为多个文件,每个类一个文件,并以该类命名。

您的项目中没有名为 AccountModels 的类,这就是为什么它没有作为模型的选项出现的原因。

【讨论】:

  • 让我头疼的是Stat 应该是User一部分。因此,如果我使用 EF 为我创建 CRUD 操作,它将不包括 Stat's。当我将类命名为 AccountModels 时,我以为我遵循了约定,然后创建了 Controller AccountController,这让我很恼火,因为那时我只能选择 UserStat 而不是 AccountModels 类。
【解决方案2】:

拥有.cs 文件不会创建“隐含”类。您只会在下拉列表中看到具有具体定义的类型。所以,如果你想拥有一个AccountModel 的父类(所有其他 POCO 都定义了该模型的属性),你需要这样的东西:

public class AccountModel
{
    public User UserModel { get; set; }
    public Stat StatModel { get; set; }
}

所以你的 Razor 模型绑定看起来类似于:

@model Your.Fully.Qualified.Namespace.AccountModel

您可以像这样绑定到模型的用户属性:

@Html.EditorFor(m =&gt; m.UserModel.Email)

【讨论】:

  • @twice AccountModel 不会是一个 EF 类 - 它的唯一目的是将 UserStat 类一起传输,以便模型绑定有一个具体的类可以使用。虽然,现在我实际上看起来更近了一点,您的 User 类实际上包含 Stat 对象的子集合。您只是想创建一个“用户编辑”视图吗?
  • 是的,User 有一个子实体 Stat。当我让 EF 为 User 创建 CRUD 操作时。我将导航到 localhost:12345/Account/Create,它会列出来自 UserUsernamePassword 的受尊重的属性和 Email 但是我想让 EF 也包含统计信息。虽然我认为我可以在视图文件中以某种方式手动添加它们。 编辑: 您是否也知道在这一行中是否需要 virtual 关键字? Stat - public virtual User User { get; set; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 1970-01-01
  • 2014-09-30
  • 2017-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多