Ef code first trong>Gert Arnold-感谢您的帮助 谢谢你的回答,我已经读过关于DataAnnotations的文章,但不确定这对我有什么帮助。当链接导航属性位于Message类中时,一切正常。但当我删除它时(或者完全删除,或者删除到派生类),EF将继续查询

Ef code first trong>Gert Arnold-感谢您的帮助 谢谢你的回答,我已经读过关于DataAnnotations的文章,但不确定这对我有什么帮助。当链接导航属性位于Message类中时,一切正常。但当我删除它时(或者完全删除,或者删除到派生类),EF将继续查询,ef-code-first,sql-generation,Ef Code First,Sql Generation,trong>Gert Arnold-感谢您的帮助 谢谢你的回答,我已经读过关于DataAnnotations的文章,但不确定这对我有什么帮助。当链接导航属性位于Message类中时,一切正常。但当我删除它时(或者完全删除,或者删除到派生类),EF将继续查询该列,即使它不再知道该列。我完全糊涂了。。。如果我从类中删除属性,DataAnnotations如何帮助我?如果需要忽略某些内容,那么有一个忽略选项,因为没有对链接id的间接引用?否则我同意这看起来很奇怪。是的,我知道忽略,但我想它不适合我的情


trong>Gert Arnold-感谢您的帮助

谢谢你的回答,我已经读过关于DataAnnotations的文章,但不确定这对我有什么帮助。当链接导航属性位于Message类中时,一切正常。但当我删除它时(或者完全删除,或者删除到派生类),EF将继续查询该列,即使它不再知道该列。我完全糊涂了。。。如果我从类中删除属性,DataAnnotations如何帮助我?如果需要忽略某些内容,那么有一个忽略选项,因为没有对链接id的间接引用?否则我同意这看起来很奇怪。是的,我知道忽略,但我想它不适合我的情况。我有一条附加了链接的消息,需要扩展消息以包含链接或集合,或者将来可能包含其他内容,这就是我决定使用继承的原因。经过多次不同的尝试后,我回到了全新的SVN版本,并从删除消息中的链接开始。在我的模型中没有定义其他自定义映射或FK,所以如果我删除链接,EF应该忘记它,对吗?但不知怎的EF记住了它,并一直将Link_Id包含到查询中。是的,我尝试了不直接或间接引用Link_Id,并且没有任何更改,它仍然保留在SQL查询中。事实上,比我更有经验的程序员也试图解决这个问题,但什么也没做。谢谢你的回答,我尝试了与你提供的几乎相同的代码-也不会工作。一个区别是我在LinkMessage.Link nav属性上面写了ForeignKey属性,指向“Link_Id”名称。明天我将尝试这个,并将提供更详细的答案。
public class Message
{
    [Key]
    [Column("Message_Id")]
    public int Id { get; set; }

    public DateTime CreatedTime { get; set; }

    [Required]
    [StringLength(MaxSubjectLength)]
    public string Subject { get; set; }

    [Required]
    [StringLength(MaxBodyLength)]
    public string Body { get; set; }

    public Link Link { get;set; }
}
CREATE TABLE [dbo].[Messages](
    [Message_Id] [int] IDENTITY(1,1) NOT NULL,
    [CreatedTime] [datetime] NOT NULL,
    [Subject] [nvarchar](78) NOT NULL,
    [BodyHtml] [nvarchar](2000) NOT NULL,
    [Link_Id] [int] NULL,
    [Collection_Id] [int] NULL,
    [MessageType] [nvarchar](30) NOT NULL,
 CONSTRAINT [PK_Messages] PRIMARY KEY CLUSTERED 
(
    [Message_Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Messages]  WITH CHECK ADD  CONSTRAINT [FK_Messages_Collection] FOREIGN KEY([Collection_Id])
REFERENCES [dbo].[Collections] ([Id])
GO

ALTER TABLE [dbo].[Messages] CHECK CONSTRAINT [FK_Messages_Collection]
GO

ALTER TABLE [dbo].[Messages]  WITH CHECK ADD  CONSTRAINT [FK_Messages_Link] FOREIGN KEY([Link_Id])
REFERENCES [dbo].[Links] ([Id])
GO

ALTER TABLE [dbo].[Messages] CHECK CONSTRAINT [FK_Messages_Link]
GO
public class LinkMessage : Message
{
    public int? Link_Id { get;set; }
}

public class CollectionMessage : Message
{
    public int? Collection_Id { get;set; }
}
SELECT 
[Extent1].[Message_Id] AS [Message_Id], 
[Extent1].[CreatedTime] AS [CreatedTime], 
[Extent1].[Subject] AS [Subject], 
[Extent1].[BodyHtml] AS [BodyHtml], 
[Extent1].[Link_Id] AS [Link_Id]
FROM [dbo].[Messages] AS [Extent1]
var b = DBContext.Messages.OfType<CollectionMessage>();

SELECT 
[Extent1].[Message_Id] AS [Message_Id], 
'0X0X' AS [C1], 
[Extent1].[CreatedTime] AS [CreatedTime], 
[Extent1].[Subject] AS [Subject], 
[Extent1].[BodyHtml] AS [BodyHtml], 
[Extent1].[Collection_Id] AS [Collection_Id], 
[Extent1].[Link_Id1] AS [Link_Id1]
FROM [dbo].[Messages] AS [Extent1]
WHERE [Extent1].[MessageType] = N'CollectionMessage'


var b = DBContext.Messages.OfType<LinkMessage>();

SELECT 
[Extent1].[Message_Id] AS [Message_Id], 
'0X0X' AS [C1], 
[Extent1].[CreatedTime] AS [CreatedTime], 
[Extent1].[Subject] AS [Subject], 
[Extent1].[BodyHtml] AS [BodyHtml], 
[Extent1].[Link_Id] AS [Link_Id], 
[Extent1].[Link_Id1] AS [Link_Id1]
FROM [dbo].[Messages] AS [Extent1]
WHERE [Extent1].[MessageType] = N'LinkMessage'


var b = DBContext.Messages;

SELECT 
[Extent1].[Message_Id] AS [Message_Id], 
CASE WHEN (((CASE WHEN ([Extent1].[MessageType] = N'LinkMessage') THEN cast(1 as bit) ELSE cast(0 as bit) END) <> cast(1 as bit)) AND ((CASE WHEN ([Extent1].[MessageType] = N'CollectionMessage') THEN cast(1 as bit) ELSE cast(0 as bit) END) <> cast(1 as bit))) THEN '0X' WHEN ([Extent1].[MessageType] = N'LinkMessage') THEN '0X0X' ELSE '0X1X' END AS [C1], 
[Extent1].[CreatedTime] AS [CreatedTime], 
[Extent1].[Subject] AS [Subject], 
[Extent1].[BodyHtml] AS [BodyHtml], 
CASE WHEN (((CASE WHEN ([Extent1].[MessageType] = N'LinkMessage') THEN cast(1 as bit) ELSE cast(0 as bit) END) <> cast(1 as bit)) AND ((CASE WHEN ([Extent1].[MessageType] = N'CollectionMessage') THEN cast(1 as bit) ELSE cast(0 as bit) END) <> cast(1 as bit))) THEN CAST(NULL AS int) WHEN ([Extent1].[MessageType] = N'LinkMessage') THEN [Extent1].[Link_Id] END AS [C2], 
CASE WHEN (((CASE WHEN ([Extent1].[MessageType] = N'LinkMessage') THEN cast(1 as bit) ELSE cast(0 as bit) END) <> cast(1 as bit)) AND ((CASE WHEN ([Extent1].[MessageType] = N'CollectionMessage') THEN cast(1 as bit) ELSE cast(0 as bit) END) <> cast(1 as bit))) THEN CAST(NULL AS int) WHEN ([Extent1].[MessageType] = N'LinkMessage') THEN CAST(NULL AS int) ELSE [Extent1].[Collection_Id] END AS [C3], 
[Extent1].[Link_Id1] AS [Link_Id1]
FROM [dbo].[Messages] AS [Extent1]
public Link Link { get;set; }
public class LinkMessage : Message
{
    [ForeignKey("Link")]
    public int? Link_Id { get; set; }
    public Link Link { get; set; }
}