«Ограничение множественности нарушено. Роль 'Rayon_Produits_Source' отношения Rayon_Produits 'имеет кратность 1 или 0..1.' - PullRequest
0 голосов
/ 22 января 2020

Я хотел бы добавить много элементов в EF, чтобы поместить их в базу данных, но у меня есть эта ошибка (приведенная в заголовке). Я искал по inte rnet, но нашел только некоторые идеи, основанные на том факте, что элемент нельзя добавить дважды, что кажется логичным. но я позаботился о предоставлении разных идентификаторов (идентификатор - это свойство, которое является ключом в связанной таблице), но это не работает, у меня все еще есть эта ошибка. К настоящему времени я понятия не имею, что может go ошибаться.

Вот данные, которые я пытаюсь передать sh в базу данных, после различных классов моделей:

самый большой контейнер: Supermarche

[DataContract]
public class Supermarche
{
    [Key]
    [DataMember]
    public int SupermarcheId { set; get; }

    [DataMember]
    public virtual ObservableCollection<Magasin> Magasins { set; get; }


}

, в нем содержится некоторый «Magasin»:

[DataContract]
public class Magasin : ElementSupermarche
{
    [Key]
    [DataMember]
    public int MagasinId { set; get; }

    [DataMember]
    public string Nom { set; get; }

    [DataMember]
    public virtual ObservableCollection<Rayon> Rayons { set; get; }


}

, который содержит в себе «Rayon»:

[DataContract]
public class Rayon : ElementSupermarche
{
    [Key]
    [DataMember]
    public int RayonId { set; get; }

    [DataMember]
    public string Nom { set; get; }

    [DataMember]
    public virtual ObservableCollection<ProduitMagasin> Produits { set; get; }


}

, который содержит некоторые « ProduitMagasin ":

[DataContract]
public class ProduitMagasin : ElementSupermarche
{
    [Key]
    [DataMember]
    public int ProduitMagasinId { set; get; }

    [DataMember]
    public string Nom { set; get; }

    [DataMember]
    public int Quantite { set; get; }

}

последняя, ​​но не в последнюю очередь, заполняющая часть:

using (var ctx = new MarketContext("sqlserver"))
        {

            new MyDataInitializer().InitializeDatabase(ctx);

            var produitMagasin1 = new ProduitMagasin() { Nom = "Pommes", Quantite = 10 };
            var produitMagasin2 = new ProduitMagasin() { Nom = "Poires", Quantite = 5 };
            var rayon1 = new Rayon() { RayonId = 1, Nom = "Fruits & légumes", Produits = new ObservableCollection<ProduitMagasin>() { produitMagasin1, produitMagasin2 } };
            var produitMagasin5 = new ProduitMagasin() { Nom = "pizzas", Quantite = 4 };
            var produitMagasin6 = new ProduitMagasin() { Nom = "quiches", Quantite = 8 };
            var rayon3 = new Rayon() { RayonId = 2, Nom = "Surgelés", Produits = new ObservableCollection<ProduitMagasin>() { produitMagasin1, produitMagasin2 } };
            var magasin1 = new Magasin() { Nom = "Auchan", Rayons = new ObservableCollection<Rayon>() { rayon1, rayon3 } };

            ctx.SaveChanges();

            var produitMagasin3 = new ProduitMagasin() { Nom = "melons", Quantite = 13 };
            var produitMagasin4 = new ProduitMagasin() { Nom = "fraises", Quantite = 37 };
            var rayon2 = new Rayon() { RayonId = 3, Nom = "Fruits & légumes", Produits = new ObservableCollection<ProduitMagasin>() { produitMagasin3, produitMagasin4 } };
            var magasin2 = new Magasin() { Nom = "Carrefour", Rayons = new ObservableCollection<Rayon>() { rayon2 } };


            var supermarche1 = new Supermarche() { Magasins = new ObservableCollection<Magasin> { magasin1, magasin2 } };
            ctx.Supermarches.Add(supermarche1);

            ctx.SaveChanges();

        }

Я не думаю, что это связано, но вот та часть, которая находится в Служба WCF и выполняется сразу после вышеприведенного кода (в другом контексте, но может быть некоторая проблема со временем, может быть, компьютер достигает части извлечения перед тем, как отправить пример информации в базу данных:

using (var ctx2 = new MarketContext("sqlserver"))
        {
            ctx2.Configuration.ProxyCreationEnabled = false;
            var sm = ctx2.Supermarches
                .Include(s => s.Magasins.Select(mg => mg.Rayons.Select(r => r.Produits)))
                .First();

            return sm;
        }

спасибо

1 Ответ

0 голосов
/ 22 января 2020

решено, район с RayonId = 2 содержал те же продукты, что и тот, у которого RayonId = 1.

...