Entity framework 实体框架-多个外键映射到同一个表的奇怪问题

Entity framework 实体框架-多个外键映射到同一个表的奇怪问题,entity-framework,Entity Framework,我正在使用EF(Framework 3.5 SP1)并设置了一个简单的两表演示: 申请者 Private _intPrefCoorespLanguage As Integer = 0 Private _intPrefInterviewLanguage As Integer = 0 Private _intPrefExamLanguage As Integer = 0 <System.Runtime.Serialization.DataMemberAttribute()> _ P

我正在使用EF(Framework 3.5 SP1)并设置了一个简单的两表演示:

申请者

Private _intPrefCoorespLanguage As Integer = 0

Private _intPrefInterviewLanguage As Integer = 0

Private _intPrefExamLanguage As Integer = 0

<System.Runtime.Serialization.DataMemberAttribute()> _
Public Property MyPrefCoorespLanguageCodeId() As Integer
    Get
        Return (_intPrefCoorespLanguage)
    End Get
    Set(ByVal value As Integer)
        _intPrefCoorespLanguage = value
    End Set
End Property

<System.Runtime.Serialization.DataMemberAttribute()> _
Public Property MyPrefInterviewLanguageCodeId() As Integer
    Get
        Return (_intPrefInterviewLanguage)
    End Get
    Set(ByVal value As Integer)
        _intPrefInterviewLanguage = value
    End Set
End Property

<System.Runtime.Serialization.DataMemberAttribute()> _
Public Property MyPrefExamLanguageCodeId() As Integer
    Get
        Return (_intPrefExamLanguage)
    End Get
    Set(ByVal value As Integer)
        _intPrefExamLanguage = value
    End Set
End Property


<OnSerializing()> _
Private Sub PopulateClientProperties(ByVal sc As StreamingContext)
    Me.MyPrefCoorespLanguageCodeId = Me.PrefCoorespLanguage.code_lang_id
    Me.MyPrefInterviewLanguageCodeId = Me.PrefInterviewLanguage.code_lang_id
    Me.MyPrefExamLanguageCodeId = Me.PrefExamLanguage.code_lang_id
End Sub
  • 申请人id int
  • 申请者优先语言合作关系(FK到代码语言)
  • 申请人优先语言考试(FK至代码语言)
  • 申请人优先语言面试int(FK至代码语言)
代码语言

  • 代码lang id int
  • 代码lang desc varchar
代码语言条目可以有0、1、*个申请者

Private _intPrefCoorespLanguage As Integer = 0

Private _intPrefInterviewLanguage As Integer = 0

Private _intPrefExamLanguage As Integer = 0

<System.Runtime.Serialization.DataMemberAttribute()> _
Public Property MyPrefCoorespLanguageCodeId() As Integer
    Get
        Return (_intPrefCoorespLanguage)
    End Get
    Set(ByVal value As Integer)
        _intPrefCoorespLanguage = value
    End Set
End Property

<System.Runtime.Serialization.DataMemberAttribute()> _
Public Property MyPrefInterviewLanguageCodeId() As Integer
    Get
        Return (_intPrefInterviewLanguage)
    End Get
    Set(ByVal value As Integer)
        _intPrefInterviewLanguage = value
    End Set
End Property

<System.Runtime.Serialization.DataMemberAttribute()> _
Public Property MyPrefExamLanguageCodeId() As Integer
    Get
        Return (_intPrefExamLanguage)
    End Get
    Set(ByVal value As Integer)
        _intPrefExamLanguage = value
    End Set
End Property


<OnSerializing()> _
Private Sub PopulateClientProperties(ByVal sc As StreamingContext)
    Me.MyPrefCoorespLanguageCodeId = Me.PrefCoorespLanguage.code_lang_id
    Me.MyPrefInterviewLanguageCodeId = Me.PrefInterviewLanguage.code_lang_id
    Me.MyPrefExamLanguageCodeId = Me.PrefExamLanguage.code_lang_id
End Sub
申请人中的每个语言参考必须有一个(且只有一个)代码语言参考

问题: 当我带回一个申请者实体(通过WCF web服务到我基于WPF的客户机)时,如果所有三种语言引用(合作响应、考试和面试)都相同,比如1000(英语),然后我修改其中一种,例如修改为1001(法语),那么所有三种语言引用都将更改为1001(法语)

奇怪的是:如果这三个参考文献都不一样(比如coorespondence=英语,exam=法语,以及interview=西班牙语),而我改变了其中一个——那么它的行为就如预期的那样,只有我改变的一个受到影响——其他的都会保持其原始状态

今天的大部分时间我都在尝试各种事情,比如在EDMX中删除和重新创建关联,重新创建EDMX数据模型,甚至创建一个新的数据库。这些都不管用——我开始觉得问题出在EF上,而不是我的代码


有什么想法吗?谢谢。

你说得对,这听起来确实很奇怪

我试图根据你所解释的重新解释你的问题,但没有成功

如果你有一点意见,我会调查的

如果你愿意,可以给我发电子邮件(alexj)@microsoft.com

亚历克斯·詹姆斯


项目经理实体框架团队

本期最终结果的更新。在Microsoft的EF团队提供了一些非常快速和有用的建议后,确定这是EF 3.5 SP1的预期行为:

“当您在服务层中查询所有语言都相同的申请者时,您将得到两个对象,一个申请者的三个导航属性都指向同一个CodeLanguage object.WCF,然后在客户端上重新创建同一个图形,这意味着您设置的三个断点确实在查看同一对象上的同一属性“

Microsoft为我的最终解决方案提供了以下基础:

首先:为申请者数据对象创建一个分部类,并创建三个引用三种语言代码ID的属性:

部分公务舱申请人

Private _intPrefCoorespLanguage As Integer = 0

Private _intPrefInterviewLanguage As Integer = 0

Private _intPrefExamLanguage As Integer = 0

<System.Runtime.Serialization.DataMemberAttribute()> _
Public Property MyPrefCoorespLanguageCodeId() As Integer
    Get
        Return (_intPrefCoorespLanguage)
    End Get
    Set(ByVal value As Integer)
        _intPrefCoorespLanguage = value
    End Set
End Property

<System.Runtime.Serialization.DataMemberAttribute()> _
Public Property MyPrefInterviewLanguageCodeId() As Integer
    Get
        Return (_intPrefInterviewLanguage)
    End Get
    Set(ByVal value As Integer)
        _intPrefInterviewLanguage = value
    End Set
End Property

<System.Runtime.Serialization.DataMemberAttribute()> _
Public Property MyPrefExamLanguageCodeId() As Integer
    Get
        Return (_intPrefExamLanguage)
    End Get
    Set(ByVal value As Integer)
        _intPrefExamLanguage = value
    End Set
End Property


<OnSerializing()> _
Private Sub PopulateClientProperties(ByVal sc As StreamingContext)
    Me.MyPrefCoorespLanguageCodeId = Me.PrefCoorespLanguage.code_lang_id
    Me.MyPrefInterviewLanguageCodeId = Me.PrefInterviewLanguage.code_lang_id
    Me.MyPrefExamLanguageCodeId = Me.PrefExamLanguage.code_lang_id
End Sub

Alex-已通过电子邮件向您发送详细说明