2011-11-23 19 views
7

我們試圖讓我們的商店中的實體框架與現有的數據庫一起工作(因此,更改數據庫模式不是一種選擇),我們創建的用於測試事物的單元測試顯示出一些非常奇怪的行爲。實體框架:從哪裏得到這些列?

這是它吐出來了,我們有一個特定的對象的SQL:

SELECT 
[Extent1].[CommentTypeId] AS [CommentTypeId], 
[Extent1].[DataPartId] AS [DataPartId], 
[Extent1].[CommentId] AS [CommentId], 
[Extent1].[CreatedTime] AS [CreatedTime], 
[Extent1].[Message] AS [Message], 
[Extent1].[From] AS [From], 
[Extent1].[Likes] AS [Likes], 
[Extent1].[SourceTypeId] AS [SourceTypeId], 
[Extent1].[StatusMessage_DataPartId] AS [StatusMessage_DataPartId], 
[Extent1].[Album_DataPartId] AS [Album_DataPartId] 
FROM [dbo].[Comments] AS [Extent1] 

的最後兩列的要求,因爲你可能會注意到,不喜歡別人。那是因爲他們實際上並不存在,我們也不知道Entity爲什麼要求他們!我們的配置文件和我們的POCO都沒有提及它們。事實上,就我們的數據庫而言,它們是完全獨立的概念,根本就沒有直接關係。

它從哪裏得到這些列,我該如何告訴它切出來?

編輯:回答下面的一些問題, 1)我們使用的是實體框架4.2。我們正在使用流暢的映射。

2)POCO本身看起來像這樣,與簡潔起見切出的平等爛攤子:

public long DataPartId { get; set; } 
public string CommentId { get; set; } 
public DateTime? CreatedTime { get; set; } 
public string Message { get; set; } 
public string From { get; set; } 
public int? Likes { get; set; } 
public string SourceTypeId { get; set; } 
public int CommentTypeId { get; set; } 

public virtual DataPart DataPart { get; set; } 
public virtual CommentType CommentType { get; set; } 

3)我們不使用EDMX。我們有一個自定義的DbContext。沒有太多的線條非常有趣。這兩個都是可能的利益:

Configuration.LazyLoadingEnabled = true; 
    Configuration.ProxyCreationEnabled = true; 

除此之外,上下文文件是很多

modelBuilder.Configurations.Add(new WhateverConfiguration()) 

public IDbSet<WhateverPoco> PocoDatabaseTableAccessor { get; set; } 

4)我們開始使用DB-第一,但沒有工作,所以我們目前正在做代碼優先。

5)這是在配置該特定POCO的膽:

HasRequired (x => x.DataPart) 
     .WithRequiredDependent (x => x.Comment); 

    HasRequired (x => x.CommentType) 
     .WithMany (x => x.Comments) 
     .HasForeignKey (x => x.CommentTypeId); 

    HasKey (x => x.DataPartId); 
    ToTable ("Comments", "dbo"); 
+4

你如何使用實體框架?你使用流利的映射,還是使用edmx文件?您是否正在使用內置於設計師的反向設計?什麼版本的實體框架?你能發佈數據模型相關部分的截圖嗎? –

+0

顯示模型,POCO類或自定義DbContext。 –

+2

看起來他們可能是代碼優先生成的外鍵字段。 – jrummell

回答

4

問題不在於您顯示的映射或類中。請檢查您的AlbumStatusMessage課程。他們是實體嗎?他們是否被映射?他們是否有集合導航屬性來評論?如果是,EF預計Comment必須對這些表具有FK。如果該表沒有這樣的列,那麼不能在這些實體中映射這些導航屬性。

Btw。 Comments表中的ID是否應爲CommentId而不是DataPartId

+0

編號CommentId是其他人設置的唯一標識符。 DataPartId是我們自己的模式的唯一標識符,它鏈接到一個集中的表格,使我們能夠以統一的格式將這些東西聯繫在一起 - 這很重要,因爲我們構建的產品的主要功能之一是數據聚合和分析。 – tmesser

+0

另外,bullseye:某人在我的知識中添加了StatusMessage和Album的導航屬性。我已經刪除了這些,並且單元測試現在顯示了不同的錯誤。感謝幫助,+1並接受。 – tmesser

+1

這是一個奇怪的錯誤,只是經歷了類似的考驗。當你刪除導航屬性時,一定要確保你從相關表中刪除它們。 – Eugene

0

打開以XML的編輯器的.edmx並搜索這些列。他們必須在你的模型中的某個地方。

編輯:你原來的問題沒有提到你先使用代碼。我首先想知道你的數據庫有什麼問題,通常工作得很好。首先使用代碼或模型,通常在創建模型(使用生成的SQL腳本)後創建數據庫。

您將最後兩個屬性聲明爲虛擬,這就是生成的SQL看起來不同的原因。從您向我們展示的代碼中,我們無法看到對相冊的引用來自何處。

因爲你有數據庫,我會在一個項目中從模型生成.edmx。然後,您可以使用POCO代碼生成器或自我跟蹤實體生成器生成實體並將它們存儲在不同的項目中。或者,您可以像現有一樣手動編寫它們。屬性名稱必須與數據庫中的列對應。

+0

請不要將流程更改作爲解決問題的主要方式。這沒有幫助。由於商店的安全標準,我無法真正瞭解爲什麼這種方式對此沒有任何幫助,但今後請考慮將這些解決方案作爲第二,第三或最終的解決方案。 – tmesser

+1

對不起,我只是想幫忙。我的第一個猜測並不是很糟糕,因爲我不知道你是如何使用實體框架的。在您的實體中進行簡單的文本搜索可能會有所幫助。我希望我的進一步解釋將在未來幫助你。我不知道你在這個項目中有多遠。我的回答非常糟糕,我收到了一票否決票嗎?至少我盡力了。 – slfan

1

實體框架與MVC一樣,在配置上使用了很多約定。這意味着它假定某些事情,除非你不告訴它。

但是,根據您提供的信息,這裏真的很奇怪。根據SQL查詢,這是來自Comments表,但是你的流暢映射表明DataPartId是主鍵。你有更多的主鍵流利映射嗎?如果沒有,你的映射可能是錯誤的。您是否檢查過生成的實際數據庫以查看數據模型是否與您嘗試執行的操作相匹配?

我的猜測是你的StatusMessage和Album類具有Comment屬性的導航屬性,但由於你只定義了DataPartId作爲你的主鍵,所以它是用來查找註釋的值,而不是CommentId。

+0

是的,有人在沒有正確配置配置中的外鍵的情況下添加了導航屬性。我只是不知道如何解釋錯誤。感謝幫助。 – tmesser