2011-11-23 14 views
7

Staramy się, aby struktura Entity działała w naszym sklepie z istniejącą bazą danych (dlatego zmiana schematu bazy danych NIE jest opcją), a testy jednostkowe, które stworzyliśmy w celu testowania rzeczy, wykazują pewne dziwne zachowanie.Entity Framework: Skąd się wziął te kolumny?

To SQL to wypluwa dla konkretnego obiektu mamy:

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] 

Ostatnie dwie kolumny o, jak można zauważyć, nie jest jak inni. To dlatego, że tak naprawdę nie istnieją, i nie mamy pojęcia, dlaczego Entity żąda ich! Ani nasze pliki konfiguracyjne, ani nasze POCO nie wspominają o nich w ogóle. W rzeczywistości, jeśli chodzi o naszą bazę danych, są one całkowicie oddzielnymi pojęciami i nie są bezpośrednio powiązane.

Skąd się bierze te kolumny i jak mam je wyciąć?

EDYCJA: Aby odpowiedzieć na niektóre z poniższych pytań, 1) Używamy Entity Framework 4.2. Używamy płynnego mapowania.

2) Samo POCO wygląda tak, z bałaganem równości wycięty dla zwięzłości:

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) Nie używamy edmx. Mamy niestandardowy kontekst DbContext. Nie ma zbyt wielu linii, które są wyjątkowo interesujące. Te dwa są prawdopodobnie zainteresowania:

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

Poza tym, plik Kontekst jest dużo

modelBuilder.Configurations.Add(new WhateverConfiguration()) 

i

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

4) Zaczęliśmy db-pierwszy, ale że nie działało, więc obecnie robimy kod po raz pierwszy.

5) Jest to wnętrzności config dla tego konkretnego 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

W jaki sposób korzystasz z frameworków encji? Czy korzystasz z płynnego mapowania, czy używasz pliku edmx? Czy korzystasz z odwrotnego scalania wbudowanego w projektanta? Jaka wersja struktury encji? Czy możesz opublikować zrzut ekranu odpowiednich części swojego modelu danych? –

+0

Pokaż model, klasy POCO lub niestandardowy kontekst DbContext. –

+2

Wygląda na to, że mogą być polami klucza obcego generowanymi przez kod. – jrummell

Odpowiedz

4

Problem nie dotyczy mapy lub klasy, którą pokazałeś. Sprawdź klasy Album i StatusMessage. Czy to byty? Czy są zmapowane? Czy mają właściwości nawigacji kolekcji do komentarzy? Jeśli tak, EF oczekuje, że Comment musi mieć FK do tych tabel. Jeśli tabela nie ma takiej kolumny, nie można zmapować tych właściwości nawigacyjnych w tych jednostkach.

Przy okazji. Czy nie powinien być identyfikator w tabeli Comments jako CommentId zamiast DataPartId?

+0

Nie. CommentId to unikalny identyfikator dla konfiguracji innej osoby. DataPartId to unikalny identyfikator naszego własnego schematu, łączy się z centralną tabelą, która pozwala nam powiązać te rzeczy w jednolity format - jest to ważne, ponieważ jedną z głównych funkcji budowanego przez nas produktu jest agregacja i analiza danych . – tmesser

+0

Ponadto, bullseye: ktoś dodany we właściwościach nawigacyjnych na StatusMessage i Albumie bez mojej wiedzy. Usunąłem je, a testy jednostek wykazują teraz inne błędy. Doceń pomoc, +1 i zaakceptuj. – tmesser

+1

To jest dziwny błąd, przeszedł podobną próbę. Usuwając właściwości nawigacji, zawsze pamiętaj o usunięciu ich z powiązanych tabel. – Eugene

0

Otwórz .edmx w XML Editor i szukać tych kolumnach. Muszą być gdzieś w twoim modelu.

EDYCJA: pierwotne pytanie nie zawierało wzmianki o tym, że najpierw używasz kodu. Zastanawiam się, jaki był twój problem z bazą danych, która zwykle działa dobrze. Z pierwszym lub pierwszym modelem kodu zwykle tworzy się bazę danych po utworzeniu modelu (przy użyciu wygenerowanych skryptów SQL).

Użytkownik zadeklarował dwie ostatnie właściwości jako wirtualne, dlatego wygenerowany kod SQL wygląda inaczej. Z kodu, który nam pokazujesz, nie wiemy, skąd pochodzi odniesienie do albumu.

Ponieważ masz bazę danych, wygenerowałbym .edmx z modelu w jednym projekcie. Następnie możesz użyć generatora kodu POCO lub generatora jednostek Self-tracking, aby wygenerować encje i zapisać je w innym projekcie. Lub możesz napisać je ręcznie, jak już masz. Nazwy właściwości muszą odpowiadać kolumnom w bazie danych.

+0

Nie sugeruj zmian procesowych jako podstawowego sposobu rozwiązania problemu. To nie jest pomocne. Nie mogę zrozumieć, dlaczego nie jest to pomocne w tym przypadku ze względu na standardy bezpieczeństwa w sklepie, ale idąc dalej, rozważ te rozwiązania jako drugi, trzeci lub ostateczny ośrodek. – tmesser

+1

Przepraszam, próbowałem ci pomóc. I moje pierwsze przypuszczenie nie było takie złe, ponieważ nie wiedziałem, w jaki sposób wykorzystałeś strukturę podmiotu. Proste wyszukiwanie tekstu w twojej jednostce prawdopodobnie pomogłoby. Mam nadzieję, że moje dalsze wyjaśnienia pomogą ci w przyszłości. Nie wiedziałem, jak daleko jesteś w projekcie. Czy moja odpowiedź była tak zła, że ​​otrzymałem głos w dół? Przynajmniej starałem się jak mogłem. – slfan

1

Entity Framework, podobnie jak MVC, używa wielu konwencji ponad konfiguracją. Oznacza to, że zakłada pewne rzeczy, chyba że mu to powiesz.

Jednak coś tutaj jest naprawdę dziwne w oparciu o dostarczone informacje. Zgodnie z zapytaniem SQL wynika to z tabeli Komentarze, ale twoje płynne mapowanie mówi, że DataPartId jest kluczem podstawowym. Czy masz dodatkowe płynne odwzorowania klucza podstawowego? Jeśli nie, twoje mapowania mogą być błędne. Czy sprawdziłeś rzeczywistą wygenerowaną bazę danych, aby sprawdzić, czy model danych pasuje do tego, co próbujesz zrobić?

Domyślam się, że twoje klasy StatusMessage i Album mają właściwości nawigacyjne do komentarza, ale ponieważ zdefiniowano tylko DataPartId jako klucz podstawowy, jest to wartość używana do wyszukiwania komentarzy, a nie komentarza CommentId.

+0

Tak, ktoś dodał właściwości nawigacyjne bez właściwego okablowania obcych kluczy w konfiguracji. Po prostu nie wiedziałem, jak interpretować błąd. Doceń pomoc. – tmesser

Powiązane problemy