实体框架-多个组成相同的类

时间:2019-02-26 10:50:42

标签: c# entity-framework ef-code-first enterprise-architect

TL; DR

我希望使用不同的方式将使用Entity Framework的多个合成映射到同一个类,而该组件具有指向作曲家的单个外键,或在两者之间有一个表。

正确的解释

我正在使用Enterprise Architect设计一些代码。感兴趣的类的UML如下所示:

UML

在C#中生成的代码是

public class A
{
    public int id { get; set; }

    public List<B> foo { get; set; }

    public List<B> bar { get; set; }

}

public class B
{
    public int id { get; set; }

    // fields...

}

太好了!那就是我想要的。但是,我的Entity Framework代码优先方法(无法更改,已经在项目中使用了多年)创建的迁移与我希望的完全不一样。

A是仅包含其字段的表(在示例中,为id)。 B如下:

|   id   | field1 | field2 | A_ID1 | A_ID2 |

嗯,它可以工作,但是问题是,在实际情况下,我对多个类有十种构图。 B的相同实例将不会在多个类之间永远共享。结果是这样的表

|   id   | field1 | field2 | A_ID1 | A_ID2 |
|   1    |   ..   |  ..    |   1   | null  |
|   2    |   ..   |  ..    |   2   | null  |
|   2    |   ..   |  ..    |  null |   3   |

即每行只有一个外键(我重复一遍,因为这是我最困扰的问题,有很多外键)不为空,其他所有为空。

您对改进此映射有任何建议吗?我正在使用的工具是

Enterprise Architect <->实体框架<-> EF代码优先迁移

1 个答案:

答案 0 :(得分:1)

从概念上讲,从AB似乎只有一个关系。但是,从每个链接中,您需要知道它是foo还是bar

在逻辑数据模型中,我可能会像这样建模: enter image description here

在可以通过链接表 ABProperties实现的数据库中,该表具有同时指向AB的外键,并且具有额外的列拥有ABTypeFoo

Bar

在B上的FK上添加唯一约束应确保1的上限约束,确保您不能将B的行与多个A相连

由于我不熟悉您的代码生成工具集,因此不确定它是否支持关联类。

如果工具集不支持关联类,则可以将类型设置为B类的属性。

enter image description here

它不像关联类的解决方案那么干净,但是我认为它可以工作,因为B只能是一个A的一部分