C# 试图用实体框架、外键数据注释修复糟糕的数据库设计

C# 试图用实体框架、外键数据注释修复糟糕的数据库设计,c#,entity-framework,C#,Entity Framework,我现在正面临一场噩梦。我必须先做一些数据库开发,在那里我无法更改数据库(太多其他应用程序依赖数据库)。基本思想是,我有两个相关的表,但在SQL中没有实际的FK关系 我马上跳进去给你看几张桌子: tblConnectorTypes: ConnectID (primary key, Int16) ConnectorType (String) tblEquipmentPorts: EquipPortID (primary key, Int32) ConnectorType (Byte

我现在正面临一场噩梦。我必须先做一些数据库开发,在那里我无法更改数据库(太多其他应用程序依赖数据库)。基本思想是,我有两个相关的表,但在SQL中没有实际的FK关系

我马上跳进去给你看几张桌子:

tblConnectorTypes:
  ConnectID (primary key, Int16)
  ConnectorType (String)

tblEquipmentPorts:
  EquipPortID (primary key, Int32)
  ConnectorType (Byte)
  ...other columns left out for brevity...
这是表的大致轮廓(表中列出了它们的SQL类型)。tblEquipmentPorts.ConnectorType映射到tblConnectorTypes.ConnectID——对吗?啊

如您所见,不仅列名不匹配,而且列类型也不同。我一直在尝试寻找某种形式的数据注释来实现这一点,但我认为不同的列类型将是一个交易杀手。下面是我创建的两个POCO的示例,用于表示上面的表:

[Table("tblEquipmentPorts")]
public class EquipmentPort {

    [Key]
    public int EquipPortID { get; set; }

    [Column("ConnectorType")]
    public byte ConnectorTypeID { get; set; }

    [ForeignKey("ConnectorTypeID")]
    public virtual ConnectorType ConnectorType { get; set; }

    // ...other columns left out for brevity...
}

[Table("tblConnectorTypes")]
public class ConnectorType {

    [Key]
    [Column("ConnectID")]
    public Int16 ConnectorTypeID { get; set; }

    [Column("ConnectorType")]
    public string Name { get; set; }
}
如您所见,我尝试使用DataAnnotation清理列名,但我不确定是否可以使用带注释的名称创建外键注释。但是,生成和运行时会产生以下关于约束类型不同的错误:

One or more validation errors were detected during model generation:

System.Data.Edm.EdmAssociationConstraint: : The types of all properties in 
the Dependent Role of a referential constraint must be the same as the 
corresponding property types in the Principal Role. The type of property
'ConnectorTypeID' on entity 'EquipmentPort' does not match the type of 
property 'ConnectorTypeID' on entity 'ConnectorType' in the referential 
constraint 'EquipmentPort_ConnectorType'.
是否可以强制在列类型之间进行某种转换,以便创建此关系

我希望我可以更改数据库本身,但正如我前面提到的,公司中有太多其他应用程序依赖于该数据库(我无法更新)。在企业工作的乐趣,对吗

谢谢你的阅读

试图用实体框架、外键数据注释修复糟糕的数据库设计

您不会用EF修复糟糕的数据库设计,因为EF只是“入门级”ORM,它严重依赖于正确的数据库设计,尤其是使用fluent API或数据注释。它还将许多关系概念移入对象世界(这就是我使用“入门级”的原因)。外键只是推送到对象世界的关系概念的一个例子

你的选择是

  • 如@msmucker0527在注释中所述修复数据库或引入视图(但如果您还想更改数据,请确保视图是可更新的)
  • (未测试)尝试更改任一实体中属性的类型,使其具有匹配的类型
您应该能够更改tblEquipmentPorts并添加一个整数类型ConnectID(带或不带外键约束),而不会对数据库造成太大影响。如果你有能力的话,最好先收拾一下,然后再把它掩盖起来


实际上,将tblEquipmentPorts包装在视图中,并使用一个连接计算字段将ConnectorType转换为INT。然后,您可以在应用程序中使用该视图而不是表。这不应该破坏任何东西(尽管它可能会限制您的应用程序),因为更改表可能会破坏代码,这些代码有一些不好的做法,例如在没有列lis的情况下插入。

您应该能够更改tblEquipmentPorts并添加整数类型的ConnectID(带或不带外键约束),而不会对数据库造成太大影响。如果你有能力的话,最好先收拾一下,然后再把它掩盖起来。这不是个坏主意,我也没想过。如果需要,我可以修改数据库并添加列。我会在开车回家的路上仔细考虑这件事。。。谢谢你的主意!实际上,将tblEquipmentPorts包装在视图中,并使用一个连接计算字段将ConnectorType转换为INT。然后,您可以在应用程序中使用该视图而不是表。这不应该破坏任何东西(尽管它可能会限制您的应用程序),因为更改表可能会破坏代码,而这些代码有一些不好的做法,例如在没有列列表的情况下插入MSMUCKER0527。最后,我打算绕过这个问题。最终我希望数据库得到更正,但我需要让项目继续运行。。。不管怎样,如果你的回答是这样的,我会把它标记为正确的。在视图中包装是我最终解决问题的原因,尽管修复数据库是我的目标。谢谢