2016-04-14 11 views
1

benim modeline dayalı tabloları güncelleştirmek olmaz :EF sadece temel özelliklerini içeren bir Kişi modeli oluşturduk İlk başta

[Required] 
    public PersonData PersonData { get; set; } 

Maalesef EF hiç Veritabanı güncelleme olmayacak - Persondata ilk başta artık hiçbir Kişi mülkiyet yoktur bu yüzden tipi Kişinin bir nesne güncellenmiş var içeriyordu. Öte yandan, EF PersonData_Id için yeni bir sütun oluşturmaz.

enter image description here

Ayrıca İD kolon otomatik artan (do diğer tablo kimliği Kolonu) değildir. .

KISITLAMA [FK_dbo.SGDB_Persons_dbo.SGDB_PersonData_Id] YABANCI KEY ([id]) REFERANSLAR [dbo] [SGDB_PersonData] ([id])

: Beni karıştıran benim Kişi tablo içinde oluşturulan alır aşağıdaki kısıtlamaya devam olduğunu

I (en azından ben öyle düşünüyorum) her şeyi denedim. Tüm tabloları/tüm veritabanını el ile bıraktım, EF'yi yeniden yükledim, manuel geçişleri gerçekleştirdim ancak hiçbir şey işe yaramıyor gibi görünüyor.

bu beni şu kodla benim veritabanını Tohum mümkün olmayabilir neden bu sorun olduğunu düşünüyorum:

protected override void Seed(PersonContext context) { 
     base.Seed(context); 
     var dep = new DepartmentContext().Departments.First(); 

     var status = new Status("Test"); 
     var persondata = new PersonData(status); 
     context.Status.Add(status); 
     context.PersonData.Add(persondata); 
     for (int i = 0; i < 10; i++) { 
      var person = new Person { 
       Firstname = $"TestPersonFirstname{i}", 
       Lastname = $"TestPersonLastname{i}", 
       SourceType = COM.SourceType.Manual, 
       Department = dep, 
       PersonData = persondata 
      }; 
      context.Persons.Add(person); 
     } 
     context.SaveChanges(); 
    } 

Her şey bu kod olsun ı bir özel durum alıyorum infaz:

Meta veri koleksiyonunda 'SGDB.DAL.Contexts.Person_Department' kimliğine sahip üye yok. Parametre adı: kimlik.

Her iki sorunlar aynı sorunla ilgili ama hem çözülecek :) önceden

Teşekkür ihtiyaç olup olmadığını bilmiyorum!

Güncelleme 1

Benim Çözüm birkaç farklı Projeleri ayrılmıştır

:

BLL, DAL COM UI

DataContexts DAL projesi içinde bulunur

, COM proje içinde Modeller .

Bölümü Modeli:

[Table("SGDB_Departments")] 
public class Department { 
    public int Id { get; set; } 

    [Required] 
    public string Costcenter { get; set; } 

    [Required] 
    public string Abbreviation { get; set; } 

    public string Description { get; set; } 

    public string FullDepartmentName { 
     get { 
      return [email protected]"{Division.Abbreviation}\{Abbreviation}"; 
     } 
    } 
    [Required] 
    public virtual Division Division { get; set; } 
} 

Persondata Modeli:

[Table("SGDB_PersonData")] 
public class PersonData { 
    public PersonData(Status status) { 
     Status = status; 
    } 

    public int Id { get; set; } 
    public DateTime Limit { get; set; } 
    public Person Responsible { get; set; } 
    [Required] 
    public Status Status { get; set; } 
} 

bir Department_Id sütunu var Kişi tablosu (Gördüğünüz gibi) (EF otomatik olarak eklenen).

Açıklama

Bir Kişi nesnesi bu kişi için ek bilgi olarak Persondata nesnesi içerir. Bir Kişinin Sorumlu Bir Kişisi olabilir/olmayabilir (bu nedenle PersonData.Responsible, Ana Kişiye bir Navigasyon Mülkiyeti değildir). Mümkünse Eklenti Tablosunun içine yabancı bir Anahtar istemiyorum. Ben anladım gibi

Ben bu deneyin ve benim sorun çözüldü eğer rapor edeceğiz

modelBuilder.Entity<Person>() 
     .HasRequired(e => e.PersonData) 
     .WithRequiredPrincipal(e => e.Responsible) 
     .WillCascadeOnDelete(true); 

modelBuilder.Entity<Person>() 
     .HasRequired(e => e.PersonData) 
     .WithMany() 
     .WillCascadeOnDelete(true); 

için değiştirmek zorunda kalacak.

Güncelleme 2

kimlik 'SGDB.DAL.Contexts.Person_Department' ile üye meta koleksiyonunda yok. Opsiyonel -

+0

PersonData aynı projede mi? Bağlam neye benziyor? –

+0

Lütfen "Departman" ve "PersonData" modellerini ekleyin. İlişki yapılandırması problemi gibi görünüyor. –

+0

@SteveGreene - güncel bilgiler için soruma bakın. – C4p741nZ

cevap

1

Modeliniz sonrası gerekir ve eski edilir Person ve PersonData arasındaki one-to-one ilişkiyi tanımlar. EF, her zaman one-to-one ilişkisinin gereken tarafını ana ve isteğe bağlı bölüm bağımlı olarak kullanır. Bu nedenle, PersonaData'un temel olduğunu ve Person - bağımlı olduğunu ve veritabanı tablosu tasarımında bunu yansıttığını düşünmektedir.

Karşılıklı ve iki tarafın da olması gerekir. Her iki taraf da gerektiğinde veya isteğe bağlı olduğunda, EF otomatik olarak temel/bağımlı tarafı elde edemez ve veri ek açıklamaları (öznitelikler) aracılığıyla bunu belirtmenin bir yolu yoktur, bu nedenle akıcı bir API kurulumuna ihtiyacınız vardır.

sizin DBContext OnModelCreating geçersiz kıl ve böyle bir şey eklemek

:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Person>()    
     .HasRequired(e => e.PersonData) 
     .WithRequiredPrincipal(e => e.Responsible) 
     .WillCascadeOnDelete(true); 

    base.OnModelCreating(modelBuilder); 
} 

Yaptığı şey Person->PersonData ilişkinin her iki tarafın gereklidir ve Person asıl olan EF söylemektir. Bu, Person.Id sütun otomatik arttırma işleminizi tekrar yapmalı ve sorunun kişi-veri bölümünü çözmelidir. Aynı prosedür diğer tüm parçaları context adlı bir değişken kullanırken

var dep = new DepartmentContext().Departments.First(); 

:

ben fark ettik başka şey

bu çizgidir. Bu sorun olabilir/olmayabilir, sadece bir göz atın.

GÜNCELLEME:

modelBuilder.Entity<Person>() 
    .HasRequired(e => e.PersonData) 
    .WithRequiredPrincipal() 
    .WillCascadeOnDelete(true); 

modelBuilder.Entity<PersonData>() 
    .HasOptional(e => e.Responsible) 
    .WithOptionalDependent() // or WithMany() 
    .WillCascadeOnDelete(false); 

unutmayın: güncellenen söz konusu açıklama itibaren böyle bunların her biri için ayrı yapılandırma ihtiyacı böylece, Person ve PersonData arasında iki ilişkiler çıkıyor PersonData tablosunda ek FK sütunu tanıtmanın bir yolu yoktur. Responsible ilişkisini temsil etmek gerekiyor, bu yüzden Responsible_Id adlı bir tablo sütununa sahip olacaksınız.

+0

Bunu yarın deneyeceğim. Son bölüm için: Bölüm ve Kişinin farklı bağlamları olması nedeniyle, tohumlamada veri tabanından bir Departman almam ve onu yeni insan nesnesine eklemem gerekiyor - bu doğru girişim mi yoksa farklı bir şekilde mi yapılmalı? İlk kısım ile ilgili olarak, PersonData tablosunun bile bir Person_ID için bir sütuna sahip olmadığını belirtmeyi unuttum (veritabanımı görüntüleyebildiğim en kısa sürede bunu tekrar kontrol edeceğim) – C4p741nZ

+1

Değil - bkz. [Paylaşılan Birincil Anahtar Dernekler] (http://weblogs.asp.net/manavi/associations-in-ef-4-1-code-first-part-3-shared-primary-key-associations) –

+0

Tamam, yazınızı okudum Bir kez daha ve o kişinin Sorumlu Sorumluluğunu * açıklamam gerektiğini düşünüyorum. Bir Kişi PersonData içerir - PersonData.Responsible Kişinin sorumlu bir kişisi yoksa null olabilir (bu Sorumlu nedeniyle gerekli değildir). – C4p741nZ

İlgili konular