【问题标题】:extend class in c# with properties用属性扩展 C# 中的类
【发布时间】:2020-03-28 07:54:36
【问题描述】:

我在我的 mvc 项目中使用实体框架 6(数据库优先)。该数据库有一个名为 User 的表,其中包含名称、地址、电子邮件等列。因此,在我的项目中,我的项目中自动生成了 User.cs 类。我需要使用一些属性扩展该用户类。我应该创建它以使用此属性扩展类吗?

    public partial class User
{
    public bool SomeBoolProperty { get; set; }
}

如果是这样,我在哪里添加它?我尝试将其添加到名为 partials\user.cs 的文件夹下,但这样做时,在查看可用属性时,此属性不可用。

【问题讨论】:

  • 你打算在哪里使用这些其他属性,在另一个层?您可能需要一个新类,该类将数据映射到绑定到数据库模型的“实体类”。
  • 创建了部分类以使扩展自动生成的代码更容易。不过,细节很重要。添加一些计算属性,或者在数据层中有意义的方法可以使用部分类来完成。另一方面,添加属性只是为了在 UI 中使用它们是一个的想法。
  • 至于在哪里添加类,就在当前类旁边,在同一个命名空间中。它们是分成两个文件的 same 类。如果您认为它们不同,则首先不应使用部分类

标签: c# partial-classes


【解决方案1】:

在您的 User.cs 中,您可以使用属性上方的 [NotMapped] 属性添加不会映射到数据库的属性:

public class User
{
    //Your autogenerated properties

    [NotMapped]
    public bool SomeBoolProperty { get; set; }

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

【讨论】:

  • 不是整个类文件都自动生成了吗(在这种情况下,下次生成时任何修改都会丢失)?
  • 您不需要继续生成类。创建表时生成一次。如果您将任何字段添加到表中,则可以通过添加普通属性手动将它们添加到类中。
【解决方案2】:

您可以有一个从 User 类派生的子类。

例如:

public class childClass:User
{
   public bool SomeBoolProperty { get; set; }
}

您可以像这样访问这些属性

User _user= new ChildClass();
_user.SomeBoolProperty =10;

【讨论】:

  • 如果这是在数据层之外使用的,但您将非数据层对象绑定到数据层,您可能不想这样做。
  • 部分类用于扩展自动生成的代码。坏主意是在没有真正的 is-a 关系时添加继承,尤其是在 ORM 实体中
  • 我不确定这里的真正要求。如果没有真正的“is-a”关系,你的陈述完全有道理
【解决方案3】:

您需要确保您为手写的partial class User 指定的namespace完全相同e与 EF6 生成的 partial class User 一样。如果两者之间的命名空间不同,那么部分类将不会放在一起,它们将保持分开。

【讨论】:

  • 嗨,我试过了,但属性仍然没有显示,所以我选择了下面的@Praveen M 解决方案。
【解决方案4】:

当您在“Partial”文件夹中添加分部类时,Visual Studio 可能会将 .Partials 添加到您添加的分部类的命名空间中,因为约定是命名空间应遵循文件夹路径。在这种情况下,编译器不会将自动生成的类与您创建的部分类连接起来,因为它们位于不同的命名空间中。

确保分部类和生成的类中的命名空间相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2014-09-17
    • 2013-06-16
    相关资源
    最近更新 更多