2008-09-23 105 views
3

什么是用于存在于SQL中的LINQ和类型表的最佳设计模式。LINQ +类型表最佳实践

我有SQL中的表限制值来键入值,我希望能够在我的C#代码中用作强类型值。

我要 'PackageStatus' 型电流的方法如下:

SQL表

PackageStatusType (int)
desc (varchar)

C#类 - 使用LINQ

public class PackageStatusType 
{ 
    static PackageStatusType() 
    { 

     var lookup = (from p in DataProvider.ShipperDB.PackageStatus 
         select p).ToDictionary(p => p.Desc); 


     Unknown = lookup["Unknown"]; 
     LabelGenerated = lookup["Label generated"]; 
     ReadyForCollection = lookup["Ready for pickup"]; 
     PickedUp = lookup["Picked up"]; 
     InTransit = lookup["In Transit"]; 
     DeliveryAttempted = lookup["Delivery attempted"]; 
     DeliveredByHand = lookup["By hand"]; 
     DeliveryFailed = lookup["Delivery failed"]; 
     Delivered = lookup["Delivered"]; 
     Voided = lookup["Voided"]; 
    } 

    public static ShipperDB.Model.PackageStatus Unknown; 
    public static ShipperDB.Model.PackageStatus LabelGenerated; 
    public static ShipperDB.Model.PackageStatus ReadyForCollection; 
    public static ShipperDB.Model.PackageStatus PickedUp; 
    public static ShipperDB.Model.PackageStatus InTransit; 
    public static ShipperDB.Model.PackageStatus DeliveryAttempted; 
    public static ShipperDB.Model.PackageStatus DeliveryFailed; 
    public static ShipperDB.Model.PackageStatus Delivered; 
    public static ShipperDB.Model.PackageStatus DeliveredByHand; 
    public static ShipperDB.Model.PackageStatus Voided; 
} 

然后我可以把PackageStatusType.Delivered放在我的C#代码中,它会正确地引用正确的LINQ实体。

这工作得很好,但让我疑惑:

一)我怎么能做出这种更有效 b)为何没有微软似乎提供任何创建强类型的类型表 c)是我的数据库设计一个好的? d)其他人都在做什么!

谢谢!

回答

3

Linq to SQL允许您将数据库中的字符串或int列映射到C#代码中的枚举。这使您可以让Linq to SQL在您从数据库中进行选择时为您映射这些值。在这种情况下,我会将我的包状态列更改为int列,其中包含来自枚举的值或表示枚举值的字符串。

在你的情况,我会有一个PackageStatus枚举与你指定的不同值,然后使用ORM设计器或SQLMetal将该列映射到该枚举。唯一需要注意的是数据库中列中的字符串值必须与枚举中的值匹配,因为Linq to SQL将使用Enum.Parse()将字符串值从数据库映射到枚举或确保int值在数据库中匹配枚举的值。

由于您甚至不需要在代码中完全映射查找表,所以这样更有效。

http://msdn.microsoft.com/en-us/library/bb386947.aspx#EnumMapping描述了这是如何工作的。

+0

正是我所希望的! – 2010-10-13 18:57:17