【问题标题】:Same variables to all classes所有类的相同变量
【发布时间】:2014-06-03 07:31:22
【问题描述】:

我有 2 个变量

  • Date-Time-Modified 这是一个日期时间变量
  • Is-Deleted 变量,它是一个布尔值。

在我拥有的每个类中都可以找到这两个变量,每次从数据库中插入、编辑或删除对象时,我都需要初始化这些变量。有没有办法做到这一点?

【问题讨论】:

  • 只是我的两分钱。我一直发现,沿着你即将走的路走下去,是有问题的。考虑构建一个真正的审计数据库或通过视图实现您将要在服务器端完成的工作。
  • 你也应该看看如何使用实体框架实现软删除stackoverflow.com/a/18985828/150342

标签: c# entity-framework generics


【解决方案1】:

使用基类。添加 2 个需要的属性(DateTime、IsDeleted)。现在每个派生类都拥有这个属性。您可以单独设置它们或遍历基本类型以分配值。 您还可以使用事件自动触发更新。但我认为您只想创建一个条目,然后将其 DateTime 属性设置为实际日期时间。

您也可以将此任务委托给数据库。它将负责设置此属性。

我懒朋友的例子;)

abstract class DatabaseEntryBase
{
    public DatabaseEntryBase()
    {
        // You can initialize properties to a default value here
        this.IsDeleted = false;
    }

    public DateTime ModifiedTime { get; set; }
    public bool IsDeleted { get; set; }
}

class Entry : DatabaseEntryBase
{}

static void Main()
{
    //-- Do your SQL stuff --//

    var newEntry = new Entry(); 
    newEntry.ModifiedTime = DateTime.Now;
    newEntry.IsDeleted = false;
}

如果您需要所有实例保存相同的值(例如多次删除),请将它们推送到集合中(此处为 List<DatabaseEntryBase> 类型的 EntryCollection)并对其进行迭代:

public void SetAllItems()
{
    foreach (DatabaseEntryBase entry in EntryCollection)
    {
        entry.ModifiedTime = DateTime.Now;
        entry.IsDeleted = [...];
    }
}

使用接口也能达到同样的效果!它可以命名为 ITaggable 并将这两个属性定义为一个契约。

【讨论】:

  • 太棒了!你能给我举个例子来说明你的意思吗?
【解决方案2】:

拥有一个包含这些成员的基类,然后让其他类扩展它。

然后在基础上有一个方法来初始化它们。然后在插入等上调用该方法。

 base.InitialiseVariables()

【讨论】:

  • 我已经做到了,我需要的是每次执行 CRUD 操作时都有当前日期和时间
  • 这是个好主意。有没有其他方法可以在不需要调用方法的情况下初始化它们?
  • @user3702061 - 您可以从类的构造函数中调用该方法。
  • @HansKesting constructor 在为类创建实例时调用,而不是在使用该实例调用其他方法时调用。
【解决方案3】:

有没有其他方法来初始化它们而不需要 调用方法?

可能另一种方法是Aspect-Oriented Programming。例如,PostSharp

代码如下所示:

[UpdateTimestamp]
public void InsertProduct(Product product)
{
    // Your logic here
}

【讨论】:

    猜你喜欢
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多