Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何在EF中模拟2的多重性_Entity Framework_Entity Framework 4_Modeling_Ado.net Entity Data Model_Multiplicity - Fatal编程技术网

Entity framework 如何在EF中模拟2的多重性

Entity framework 如何在EF中模拟2的多重性,entity-framework,entity-framework-4,modeling,ado.net-entity-data-model,multiplicity,Entity Framework,Entity Framework 4,Modeling,Ado.net Entity Data Model,Multiplicity,我有两种情况需要这样的东西。在我的模型中,我有一条消息,它涉及一个或两个人。此外,消息与两个地址关联,即from地址和to地址 在两个人的第一种情况下,我想指定消息和人的多重数1--1..2之间的关联,或者指定两个关联,一个是1--1,另一个是1--0..1。但是,我不能(或不知道如何)将多重性设置为2。我可以想象,可以将其设置为1--*并将约束设置为最大值2(但我不知道如何执行)。 通过添加这两个关联,当我看到消息这一面时,我觉得有点奇怪,因为这两个关联都有一个1,表示人应该有两条与之相关的消

我有两种情况需要这样的东西。在我的模型中,我有一条
消息
,它涉及一个或两个
。此外,消息与两个
地址
关联,即from
地址
和to
地址

在两个
的第一种情况下,我想指定
消息
的多重数1--1..2之间的关联,或者指定两个关联,一个是1--1,另一个是1--0..1。但是,我不能(或不知道如何)将多重性设置为2。我可以想象,可以将其设置为1--*并将约束设置为最大值2(但我不知道如何执行)。
通过添加这两个关联,当我看到
消息
这一面时,我觉得有点奇怪,因为这两个关联都有一个1,表示
应该有两条与之相关的
消息
。我可能希望在
消息
端使用类似于0..1的值来表示对它们具有xor约束的两个关联,但我不知道这是否是一种好的做法,甚至在EF中也是可能的。

对于第二种情况,问题非常相似,除了始终存在from
地址
和to
地址
。将多重数设置为1--*对我来说似乎不合适。在这里,我想肯定会有两个关联,一个from关联和一个to关联(它们碰巧都指向
地址
实体)。但是,这会在消息的
端产生相同的问题,即有两个1或两个0..1。

所以我的问题是,如何在EDM中正确建模

提前谢谢

更新1: 为了澄清这个问题,我将提供一些背景信息,说明我为什么需要这样一个模型。我必须能够创建一条消息。在这封信中,我必须说明它是涉及一个人还是两个人。我指定了这些人的名字、姓氏和一些其他非唯一属性(两个人可以有相同的名字)。我可以在
消息
实体(fname1,lname1,fname2,lname2)中转储所有这些属性,但这似乎是个坏主意。因此,
实体诞生了。但是,这可能看起来像一个
可以链接到许多消息,但事实并非如此。可以有两个具有相同属性的不同的人。无法判断这些人在现实生活中是否是同一个人

在地址的情况下,类似的论点成立。两个地址的拼写可能略有不同,但如果我将它们写在一封信上并寄出,它们将到达同一个位置(例如sesamestreet或sesamestr.)。因此,我没有一个
地址
实体连接到多个
消息
。同样,唯一的原因是地址是一个单独的实体,因为我有两个em具有完全相同的属性。 从数据库设计的角度来看,这可能没有意义,从类图的角度来看,这可能更有意义。我的印象是EF中的EDM不应该像一个数据库设计,而是更像一个领域模型,所以我希望我做了正确的事情

更新2: 我只是想到了我认为在这种情况下最好的方法。因为
Person1
Person2
之间几乎没有区别,我想让
Message
Person
1..*之间的关联可以接受。事实上,许多意味着两个将是较低层处理的事情。在address的情况下,from和to是完全不同的。它们都是地址,但我觉得我不能把它们列出来。我可以将from和to地址拆分为单独的实体,并让它们从
地址
继承。然后将
Message
与每个子类关联。这似乎有点过分了,但您可以推断出,从地址在某一点上可能与到地址有不同的要求,因此具有不同的属性。

但我并不是100%满意(尤其是地址部分)。这个解决方案可能没问题,但我觉得它避免了核心问题。

对于第一个问题(Message-Person):

关键问题是:您希望person1不可为null吗?第二个人呢

您绘制的第二个备选方案在我看来很好,因为您需要一条消息正好有一个Person1(比如:消息的创建者),所以是一个不可为null的属性。Person2(比如:上次更新消息的人)可以为null,也可以链接到现有的人。很好

从person类透视图中可以看到,它有两个关联(和两个导航属性,您将它们折叠起来…),一个用于特定person(person实体的实例)是其创建者的消息,另一个用于该特定person是最后一个更新者的消息。很好!不是吗?通过这种方式,您可以从消息的角度查询模型(给我所有消息以及创建它和上次更新它的每个消息的人…)或者…查询一个人并收集此人创建的或是最后更新者的所有消息…明白吗

但所有的一切都归结为确定是否允许Person1和Person2为空

我没有读你的第二个问题,但我认为它更像是一个问题。你也需要一些建议吗?打电话给我

而且。如果从业务/功能的角度来看,有两个人就足够了,那么备选方案2是可行的。另一方面,如果您想要一个完整的个人历史记录,包括消息的更新方式和创建人(这将始终是一个完整的历史记录),那么您将得到一个导航属性message.Creator(一个完整的)和message.Updaters(0到多个)。看到了吗?从用户的视图P