2011-11-23 12 views
7

Varlık veritabanını mevcut bir veritabanıyla (ve bu nedenle veritabanı şemasının değiştirilmesi bir seçenek DEĞİLDİR) çalışan Entity çerçevesini almaya çalışıyoruz ve bir şeyleri test etmek için yarattığımız birim testleri bazı garip davranışlar gösteriyor. Dikkatinizi çektiği gibi, diğerleri gibi değil,Entity Framework: Bu sütunları nereden alıyorsunuz?

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] 

son iki sütun istendi:

Bu

elimizdeki belirli bir nesne için tükürüyor SQL olduğunu. Çünkü aslında var olmadıkları ve Entity'nin onları neden talep ettiği hakkında hiçbir fikrimiz yok! Ne yapılandırma dosyalarımız ne de bizim POCO'larımız bunlardan hiç bahsetmiyor. Aslında, veritabanımız ilerledikçe, tamamen ayrı kavramlardır ve doğrudan hiçbir şekilde alakalı değildirler.

Nereden bu sütunları oluyor ve bunu kesmek için bunu nasıl anlatır?

DÜZENLEME: Biz Entity Framework 4.2 kullanıyorsanız 1), aşağıda bazı sorulara cevap vermek. Akıcı haritalama kullanıyoruz.

2) POCO kendisi kısa olması açısından kesip eşitlik karmaşa ile, şuna benzer: Biz EDMX kullanmıyorsanız

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). Özel bir DbContext var. Çok ilginç olmayan çok fazla çizgi yok. Bağlam dosyası Biz db-ilk ile başladı

modelBuilder.Configurations.Add(new WhateverConfiguration()) 

ve

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

4) bir sürü Bunun ötesinde

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

, ama bu: Bu iki muhtemelen ilgilendiren işe yaramadı, bu yüzden şu anda ilk kod yapıyoruz.

5) Bu belirli POCO için config bağırsaklar geçerli:

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

Öğe çerçevesini nasıl kullanıyorsunuz? Akıcı eşleme mi kullanıyorsunuz yoksa bir edmx dosyası mı kullanıyorsunuz? Tasarımcının içine yerleştirilmiş ters çevrimi mi kullanıyorsunuz? Varlık çerçevesinin hangi sürümü? Veri modelinizin ilgili bölümlerinin ekran görüntüsünü gönderir misiniz? –

+0

Modeli, POCO sınıflarını veya özel DbContext'i gösterin. –

+2

Kod ilk önce oluşturulmuş yabancı anahtar alanları gibi görünüyor. – jrummell

cevap

4

Sorun, gösterdiğiniz harita veya sınıfta değil. Album ve StatusMessage sınıflarınızı kontrol edin. Onlar varlık mı? Haritalanmış mı? Yorumlar için koleksiyon gezinme özellikleri var mı? Eğer evet EF, Comment'un bu tablolara FK içermesi gerektiğini umuyorsa. Tabloda böyle bir sütun yoksa, bu varlıklar içinde eşlenen bu gezinme özelliklerine sahip olamazsınız.

B

Btw. Comments tablosundaki kimlik DataPartId yerine CommentId olmalıdır?

+0

No. CommentId, başka birinin kurulumu için benzersiz bir tanımlayıcıdır. DataPartId, kendi şemamız için benzersiz bir tanımlayıcıdır, bu şeyleri tekdüze bir biçimde bir araya getirmemize olanak tanıyan merkezi bir tabloya bağlanır - bu önemlidir çünkü ürettiğimiz ürünün ana işlevlerinden biri veri toplama ve analizidir . – tmesser

+0

Ayrıca, bullseye: Birisi bilgim olmadan StatusMessage ve Albümde gezinme özelliklerine eklendi. Bunları kaldırdım ve birim testleri şimdi farklı hatalar gösteriyor. Yardımı takdir et, +1 ve kabul etti. – tmesser

+1

Bu garip bir hatadır, sadece benzer çekişmelerden geçti. Gezinme özelliklerini kaldırdığınızda, bunları her zaman ilgili tablolardan da kaldırdığınızdan emin olun. – Eugene

0

aç XML Düzenleyicisi'nde .edmx ve bu sütunların arayın. Modelinde bir yerlerde olmalılar.

DÜZENLEME: İlk kod kullandığınızı orijinal soru söz etmedi. İlk başta Veritabanında sorunların ne olduğunu merak ediyorum, genelde iyi çalışıyor. Kod ilk önce veya modelle, normalde modeli oluşturduktan sonra (oluşturulan SQL komut dosyalarını kullanarak) veritabanını yaratırsınız.

Oluşturulan SQL farklı görünüyor, bu yüzden sanal olarak son iki özelliklerini açıkladı. Bize gösterdiğiniz koddan, Albüm referansının nereden geldiğini göremeyiz. Veritabanını Çünkü

, bir tane projede modelden .edmx üretecektir. Daha sonra varlıkları oluşturmak ve bunları farklı bir projede saklamak için bir POCO kod üreteci veya Otomatik İzleme varlık jeneratörü kullanabilirsiniz. Veya elinizde olduğu gibi el ile yazabilirsiniz. Özellik isimleri veritabanındaki sütunlara karşılık gelmelidir.

+0

Lütfen işlem değişikliklerini bir sorunu çözmenin birincil yolu olarak önermeyin. Bu yararlı değil. Bu durumda mağaza güvenlik standartlarına bağlı olarak bunun neden yararsız olduğuna gerçekten katlanamıyorum, ancak ileride bu çözümleri ikinci, üçüncü veya nihai bir tesis olarak düşünün. – tmesser

+1

Üzgünüz, yardım etmeye çalıştım. Ve ilk tahminim o kadar da kötü değildi çünkü varlık çerçevesini nasıl kullandığınızı bilmiyordum. Varlığınızda basit bir metin araması muhtemelen yardımcı olabilirdi. Umarım diğer açıklamalarım gelecekte size yardımcı olacaktır. Projede ne kadar kaldığını bilmiyordum. Cevabım gerçekten o kadar kötüydü ki oylama aldım? En azından elimden geleni yaptım. – slfan

1

Varlık Framework, MVC gibi yapılandırma yerine kurallar bir çok kullanır. Bu, söylemediğiniz sürece bazı şeyleri varsaydığı anlamına gelir.Bununla birlikte, sağladığınız bilgilere dayanarak burada bir şey gerçekten gariptir. SQL sorgusuna göre, bu Yorumlar tablosundan geliyor, ancak akıcı haritalama DataPartId birincil anahtar olduğunu söylüyor. Ek birincil anahtar akıcı eşlemeleriniz var mı? Değilse, eşlemeleriniz yanlış olabilir. Veri modelinin yapmaya çalıştığınız şeyle eşleşip eşleşmediğini görmek için oluşturulan gerçek veritabanını kontrol ettiniz mi?

Benim tahminim sizin StatusMessage ve Albüm sınıfları Comment için seyir özelliklere sahip olduğunu, ancak yalnızca birincil anahtar olarak DataPartId tanımladık beri, işte yorum, değil CommentId bakmak için kullandığı değerdir.

+0

Evet, birisi yapılandırmada yabancı anahtarları düzgün bir şekilde kablolamadan navigasyon özelliklerini ekledi. Hatayı nasıl yorumlayacağımı bilemedim. Yardımı takdir et. – tmesser