【问题标题】:Best way to represent a field in an Object that comes from and ID+Name from the DB?表示来自数据库的对象和 ID + 名称的字段的最佳方法?
【发布时间】:2011-03-21 22:26:07
【问题描述】:

我有这个(为说明目的而简化)对象,它表示一个表,其中包含来自数据库的字段(id、type、brand、model、price)。对于 type、brand 和 model,只存储 Id,它们与 Types、Brands 和 Models 数据库有关系。通过一些连接,对象加载数据并获取它们的 Name 属性:

public class Car
{

    public int TypeId;
    public int BrandId;
    public int ModelId;
    public decimal Price;

    public string TypeName;
    public string BrandName;
    public string ModelName;

}

在我看来,这让对象结构“脏”了。将其加载到更多结构化对象中的最佳方法是什么,例如:

public class Car
{
    public Definitions.CarTypes Type;
    public Definitions.CarBrand Brand;
    public Definitions.CarModel Model;
    public decimal Price;
}

我关心的是当从数据库返回查询时,数据将如何填充到对象中。是否为每个字段使用构造函数 (thisCar.Brand = new CarBrand(reader["id"],reader["name"]); 是一种好方法?

【问题讨论】:

    标签: c# class business-objects


    【解决方案1】:

    我的第一个倾向是使用枚举。枚举可以是各种底层类型,但默认为 Int。您可以显式设置 Enum 中每个元素的 int 值,这对于使它们与其他一些预定义列表匹配(例如错误代码,或者在您的情况下:数据库中项目的唯一 ID)很有用。

    解析数据集并创建“汽车”对象的代码可以简单地将这些数据库行 ID 转换为相应的枚举。

    class Program
    {
        static void Main(string[] args)
        {
            Car myCar = new Car();
            myCar.Brand = (CarBrand)1;
            myCar.Model = (CarModel)10;
            myCar.Type = (CarType)3;
    
            Console.WriteLine("You drive a {0} {1} {2}. Niiiice.", myCar.Brand, myCar.Model, myCar.Type);
            Console.ReadLine();
    
        }
    }
    
    public class Car
    {
        public CarType Type {get; set;}
        public CarBrand Brand {get; set;}
        public CarModel Model {get; set;}
        public decimal Price {get; set;}
    }
    
    
    public enum CarBrand
    {
        BMW = 1,
        Audi = 2,
        Ford = 5,
        Volkswagen = 23
    }
    public enum CarModel
    {
        M3 = 10,
        R8 = 211,
        Mustang = 3,
        Passat = 4
    }
    public enum CarType
    {
        Sedan = 3,
        Coupe = 10,
        Convertible = 21
    }
    

    当然你会想要做一些错误检查等等。Enums 的一个缺点是你受 C# 字段命名要求的摆布,也许还有 style-cop,所以拥有一个属性可能是有意义的或转到字符串资源(如 RESX)并返回“FriendlyBrandName”或其他内容的实用程序方法。

    【讨论】:

    • 我相信这个解决方案只有在考虑到代码生成的情况下才适用,因为在运行时无法填充枚举。这也将使在不求助于支持类的情况下拥有其他字段而不是 id/value 的可能性无效。
    猜你喜欢
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2018-07-27
    • 2019-08-06
    • 1970-01-01
    • 2012-07-27
    相关资源
    最近更新 更多