1

所以我正在做一个简单的项目管理系统并且遇到了一个 LINQ quandry。这可能很常见。项目任务基于模板(与数据库中的任务共享一个表)。项目任务具有默认从任务模板继承的多个字段,除非它们具有值。例如,UnitPrice 为 0 的 ProjectTask 记录将查看 ProjectTask 模板记录以获取实际价格。

如何使用 LINQ 实现这一点?我想过做一个 ObjectDataSource,但这远离了我处理所有其他数据的方式(在 LINQ 中)。我尝试使用如下代码创建派生类,但它没有出现在 LinqDataSource 中,即使我在 ORM 设计器中设置了继承。

我做了一些谷歌搜索,但似乎找不到一个好的模型。有什么想法吗?一如既往地感谢。

public class ProjectTaskWithInheritance : ProjectTask
{
    public new decimal UnitPrice
    {
        get
        {
            if (IsServiceOverride)
                if (base.UnitPrice != 0)
                    return base.UnitPrice;

            return base.TaskTemplateRecord.UnitPrice;
        }
        set { base.UnitPrice = value; }
    }
}
4

1 回答 1

2

您正在混淆继承的级别:您的系统对相互继承的事物进行建模(即项目任务UnitPrice从项目任务模板继承);同时,您正尝试在 .NET 程序中使用继承对其进行建模。这是两种不同的继承:一种在您的数据层中,而另一种在您的代码层中。

我建议使用代码层中的包含来对数据层中的继承进行建模,而不是使用继承。每个都ProjectTask可以有一个可选的实例ProjectTask作为任务模板;当在任务本身中找不到属性时,请尝试在模板对象中查找它。使属性可以为空,以允许在对象或其模板中未设置属性的情况。

class ProjectTask {
    private ProjectTask Template {get;set;}
    private decimal? unitPriceOverride;
    public decimal UnitPrice {
         get {
             return unitPriceOverride ?? (Template != null ? Template.UnitPrice : null);
         }
         set {
             unitPriceOverride = value;
         }
    }
}
于 2012-12-20T16:50:50.440 回答