【问题标题】:c# auto generated partial class redefine property get set时间:2018-01-10 标签:c#autogeneratedpartialclassredefinepropertygetset
【发布时间】:2015-06-12 14:09:24
【问题描述】:

我主要从经典的 asp 迁移到 .NET。所以这可能是一个愚蠢的问题,但我找不到答案。

我有一个使用数据库优先和实体框架的 MVC 应用程序。现在我想为自动生成的“部分”类添加一些逻辑。从我读过的内容来看,这应该是创建一个具有相同命名空间和名称的新部分类的问题。但是当我这样做时,我得到一个错误“(这个成员被定义了不止一次)”和“[部分类]和[部分类]之间的歧义”。我了解错误的含义,但我不确定如何解决问题。

我想在集合中添加一些逻辑;访问器。

所以在生成的类中我有

public partial class QualityChecks
{
.....
    public int DailyCount { get; set; }
...
}

在我的新部分类中,我想添加到集合代码中以确保只添加大于 0 的值。如果添加负值,则需要记录并更改为 0 例如我的新部分课程是:

public partial class QualityChecks    {
public int DailyCount         {        
set
        {
            DailyCount = value;
            if it's < 0 log and set to 0
        }

    }

如果不清楚,也许这会有所帮助: 目前我有很多代码可以做到

QualityChecks qc = new QualityChecks();
qc.DailyCount = enteredAmount;
....
db.QualityChecks.add(qc);

然后在任何地方更新该逻辑,将其包含在 QualityChecks 类中会很好。

这是正确的做法吗?如果是这样,我需要进行哪些更改才能使其正常工作?

提前感谢您的任何提示和帮助!

【问题讨论】:

  • 作为替代方案,您是否考虑过这个想法:将这些实体类保留在您的存储库代码中。然后使用github.com/AutoMapper/AutoMapper 之类的东西在这些实体类和其他可以包含您需要的检查的数据类之间进行映射。那样。你可以避免部分类的问题。
  • 有趣的是,我在这个项目的其他地方使用了 Automapper,效果很好。我没想过那样使用。可能是我缺乏经验,但创建新类和映射感觉更混乱?

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


【解决方案1】:

您不能在两个不同的文件中定义相同的成员。

您可以尝试定义一个新的包装器属性(例如 MyDailyCount),以添加额外的逻辑并在最后更新基础 DailyCount,以便将其持久化到数据库中。

public int MyDailyCount 
{
   get { return DailyCount; }
   set 
   { 
         DailyCount = value; 
         // your extra logic 
    }
}

【讨论】:

  • 所以在我剩下的代码中我有 qc.DailyCount = enterAmount;将需要更改为 qc.MyDailyCount = enterAmount; ?
  • 是的。其他选项是将映射到数据库的属性名称更改为(例如 DbDailyCount)并使用 DailyCount 作为包装属性的名称。您也可以考虑将用于数据库实体的类与模型中的实体(具有逻辑的实体)解耦并从一个转换到另一个。
  • 我想要的唯一额外更改是将 autoGenerated 属性设为私有。有没有办法永久设置,还是每次更新模型时都必须进行更改?
  • 不确定。理想情况下,您不想在自动生成的属性上做那种事情,您希望它们至少是受保护的虚拟属性,以便 EF 可以对它们施展魔法(延迟加载等)
猜你喜欢
  • 1970-01-01
  • 2014-11-13
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 2012-09-18
  • 2015-04-29
相关资源
最近更新 更多