2011-12-04 9 views
7
public class Client 
{ 
    public Int32 ClientID { get; set; } 

    public virtual ICollection<Inquiry> InquiryManufacturers { get; set; } 
    public virtual ICollection<Product> Products { get; set; } 
    public virtual ICollection<Inquiry> InquiryRetailers { get; set; } 
} 

public class Product 
{ 
    public Int32 ProductID { get; set; } 

    public Int32 ClientID { get; set; } 
    public virtual Client Client { get; set; } 

    public virtual ICollection<Inquiry> Inquiries { get; set; } 
} 

public class Inquiry 
{ 
    public Int32 InquiryID { get; set; } 

    public Int32 ProductID { get; set; } 
    public Int32 ManufacturerID { get; set; } 
    public Int32 RetailerID { get; set; } 
    public virtual Product Product { get; set; } 
    public virtual Client Manufacturer { get; set; } 
    public virtual Client Retailer { get; set; } 
} 

Fluent API jest jakoKod powodujący, że wymagana relacja jest opcjonalna?

HasRequired(i => i.Product) 
    .WithMany(p => p.Inquiries); 
HasRequired(i => i.Manufacturer) 
    .WithMany(p => p.InquiryManufacturers) 
    .HasForeignKey(p => p.ManufacturerID); 
HasRequired(i => i.Retailer) 
    .WithMany(p => p.InquiryRetailers) 
    .HasForeignKey(p => p.RetailerID); 

Więc oto kilka klas, które mam zdefiniowane. Mają relacje w następujący sposób: Klient & Produkt ma jeden do wielu, Klient & Zapytanie ma jeden do wielu i Produkt & Pytania mają jedno do wielu. Używam tutaj Code First. Teraz za pomocą płynnego API zdefiniowałem relacje, te relacje mają być wymagane, co oznacza, że ​​Klient & Relacja produktu nie może być pusta, a Klient i Zapytanie również nie może być wartością zerową.

Jednak związek między klientem & Zapytanie jest wymuszane jako opcjonalne z pierwszym kodem. Kiedy próbuję je wprowadzić, EF nie generuje bazy danych.

Czy ktoś może mi powiedzieć, co jest nie tak z moim modelem, że powoduje, że EF nie tworzy wymaganego związku między klientem & Inruiry? Czy to z powodu kaskadowego usuwania? Czytając niektóre, gdzie mssql może mieć tylko jedną kaskadową ścieżkę usuwania między Klientem, Produktem i Zapytaniem. Każde wyjaśnienie pomocy byłoby miłe.

+0

Czy otrzymujesz jakieś błędy? Co masz na myśli mówiąc, że "jest zmuszany do bycia opcjonalnym"? – CDeutsch

+0

nie ma błędów tylko to, że baza danych nie zostanie wygenerowana, ale jeśli zrobię RetailerID i ManufacturerID null i Fluent Api jako HasOptional, wtedy baza danych zostanie wygenerowana. – user781310

+0

Prosimy o przesłanie kompletnej konfiguracji odwzorowania: wszystko, co jest związane z 3 omawianymi jednostkami. Podaj informacje wystarczające do odtworzenia Twojej sytuacji. Poza tym, na który silnik bazodanowy celujesz? –

Odpowiedz

2

Kod EF Najpierw ustala się domyślnie kasowanie kasowania na wygenerowanym kluczu obcym. A ponieważ można mieć tylko jedno ścieżek kaskadowe masz coś wyjątku takiego:.

„Wprowadzenie klucz obcy ograniczenie«Inquiry_Retailer»na stole «Zapytania»może powodować cykli lub wiele ścieżek kaskadowe Określ na DELETE NO Akcja lub ON UPDATE NO ACTION lub modyfikują inne ograniczenia klucz obcy

W modelu masz 3 ścieżek kaskadowe od klienta do zapytania:.

klienta --InquiryRetailers ->Zapytanie
Client --InquiryManufacturers ->Zapytanie
Client --Products ->wyrobów --Inquiries ->Zapytanie

Musisz ustawić WillCascadeOnDelete(false) co najmniej dla dwóch relacji (w zależności od wymagań):

modelBuilder.Entity<Inquiry>().HasRequired(i => i.Product) 
    .WithMany(p => p.Inquiries); 
modelBuilder.Entity<Inquiry>().HasRequired(i => i.Manufacturer) 
    .WithMany(p => p.InquiryManufacturers) 
    .HasForeignKey(p => p.ManufacturerID).WillCascadeOnDelete(false); 
modelBuilder.Entity<Inquiry>().HasRequired(i => i.Retailer) 
    .WithMany(p => p.InquiryRetailers) 
    .HasForeignKey(p => p.RetailerID).WillCascadeOnDelete(false); 
+0

Dziękuję, przepraszam za spóźnioną odpowiedź, ale byłem zajęty, po przeczytaniu kilku innych blogów i książek zorientowałem się, że domyślne usuwanie kaskadowe było problemem. – user781310

Powiązane problemy