2015-04-18 23 views
6

C# ile başladım ve kendi DB'mi yapmak istedim. Ben buBirincil anahtar ihlali Varlık Çerçeve Kodu İlk

modelBuilder.Entity<BModel>().HasRequired(t => t.Model).WithMany(); 
çözülebilir düşündüm

Violation of PRIMARY KEY constraint 'PK_dbo.AModels'. Cannot insert duplicate key in object 'dbo.AModels'. The duplicate key value is (48ee1711-8da4-46c1-a714-19e985211fed).\r\nThe statement has been terminated.

: Ben DB BModel kaydetmeye çalıştığınızda

Ben iki model

public class AModel 
{ 
    public Guid ID { get; private set; } 
    public string Name { get; set; } 
    public int Count { get; set; } 
    public AModel() 
    { 
     this.ID = Guid.NewGuid(); 
    } 
} 

public class BModel 
{ 
    public Guid ID { get; private set; } 
    public string Name { get; set; } 
    public AModel Model { get; set; } 
    public BModel() 
    { 
     this.ID = Guid.NewGuid(); 
    } 
} 

var, bu hatayı olsun

ama tamamen kaybettim gibi görünüyor. Bu basit örnekle bana yardımcı olabilir misiniz?

+0

hata mesajı şifreli olduğu yinelenen şansını çünkü Bir Rehber ile anahtarlar astronomik olarak olası değildir. Ancak şüphelendiğim şey, yanlış haritalama nedeniyle, birden fazla aynı yabancı anahtar oluşturmaya çalışmaktır. ModelBuilder.Entity () .HasRequired (t => t.Model) .WithMany() öğesini kullanırsanız ne olur? (X => {x.ToTable ("BAs"); x.MapLeftKey ("BId") x.MapRightKey ("AId");}); '? –

+1

BModel oluştururken yeni bir AModel örneği oluşturmuyorum, ancak bunun yerine, Combobox'tan önceden oluşturulmuş bir AModel örneğini seçiyorum. Ben sadece BModel'den AModel'e referans oluşturmasını istiyorum. – xfrog

+0

Bu nasıl çalışır? Yeni model oluşturulduğunda yeni bir GUID oluşturuyorsunuz. ve özel bir set var.Verilerden bir Mod aldığında, ID'ye nasıl değer atar? –

cevap

11

Yorumunuz önemli bilgileri ortaya çıkarır. Bu AModel'i combobox'ınızdan BModel'inize eklediğinizde, DbContext'inizden o zamana dek ayrılmış olur. Daha sonra modelinize eklediğinizde, Entity Framework yeni bir nesneye sahip olduğunuzu düşünecektir.

Iletisiminizin DatabaseGenerationOptions.None olarak ayarlandigindan, kendiniz sagladiginiz birincil anahtari kullanacaktir. Senin durumunda, bu müstakil nesnenin PK'sidir. Böylece, EF bu girişi girmeyi denediğinde, yukarıdaki özel durumu atar, çünkü o anahtara sahip bir varlık zaten oradadır.

bu çözmek için birkaç yol vardır:

  • Bunu kullanmak için izin Bu varlık alımı üzerine sizin bağlamda eklenecektir Mevcut varlığı

alın. Ancak bu, ekstra bir arama anlamına gelir: önce onları açılan kutuya almak ve daha sonra, veritabanından yeniden almak için Kimlik Kutusu'ndaki varlıktan kimliği kullanmak.

Örnek kullanım:

AModel Get(AModel detachedModel) 
{ 
    using(var context = new MyContext()) 
    { 
     return context.AModels.Single(x => x.ID == detachedModel.ID); 
    } 
} 
  • Bu sadece varlık veritabanında zaten var olduğunu Varlık-Çerçeve farkında yapmalıdır

mevcut modelden takın. takmak için

using(var context = new MyContext()) 
{ 
    context.AModels.Attach(detachedModel); 
} 

diğer yollar (durumda da değerler değişti) Değişmeyen

context.Entry(detachedModel).State = EntityState.Unchanged; 

veya Değiştirilmiş devleti ayarlayarak olduğunu

context.Entry(detachedModel).State = EntityState.Modified; 
+0

Teşekkürler, bunu Devlet Değişmeziyle çözdüm ve istediğim gibi çalışıyor. – xfrog

İlgili konular