我在Windows窗体应用程序上使用的数据库有很多表,包括主键int标识字段,varchar描述和与另一个表的一对一关系,其中id和描述是使用
使用Entity Framework Code First映射到数据库的C#POCO的一个示例是:
public class OtherClass
{
public int Id { get; set; }
public string Description { get; set; }
}
public class Foo
{
public int Id { get; set; }
public string Description { get; set; }
public OtherClass OtherClassProperty { get; set; }
}
因为像“Foo”这样的类都共享相同的结构,所以我创建了一个基本表单,应该能够处理所有类这样的类。
我的问题是所有这些类的Id和Description都有不同的属性名称(例如,有时称为Name)。更不用说他们引用的其他课程总是不同。
我的第一个想法是创建一个需要实现具有固定名称的属性的接口:Id,Description,KeyId,KeyDescription。这些属性将在每个类上实现,但仅指向“真实属性”。像这样:
public class Foo : MyInterface
{
public int Id { get; set; }
public string Description { get; set; }
public OtherClass OtherClassProperty { get; set; }
//Interface implementation
public int CommonId { get { return this.Id; } set { this.Id = value; } }
public int CommonDescription { get { return this.Description; } set { this.Description = value; } }
public int CommonKeyId { get { return this.OtherClassProperty.Id; } set { this.OtherClassProperty.Id = value; } }
public int CommonKeyDescription { get { return this.OtherClassProperty.Description; } set { this.OtherClassProperty.Description = value; } }
}
我的印象是可能有更好的解决方案。我还可以想象实现属性属性并使用反射在运行时检查并获取属性。
有人会对这种情况提出建议吗?
提前致谢。
答案 0 :(得分:1)
对我而言,它看起来是一个很好的实现。
这是直截了当且易于理解的。
但是我会考虑使用显式接口实现
public int MyInterface.CommonId { get { return this.Id; } set { this.Id = value; } }
而不是
public int CommonId { get { return this.Id; } set { this.Id = value; } }
如果可能的话,我还会创建一个长期的架构目标来重构数据库以统一命名。
答案 1 :(得分:1)
固定名称听起来像是一个好方向。请查看Adapter pattern以获得更正式的方法。