1

私はテーブルレストランを持っています。レストランには複数の専門店があります。特産品は、たとえば、チャイニーズ、スペイン語、ギリシャ語などです。

レストランのテーブル/クラス:

[Table("Restaurant")]
public class Restaurant
{
    [Key]
    [Column(Order = 0)]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    [MaxLength(40)]
    [Column(Order = 2)]
    public string Name { get; set; } 

    [MaxLength(1000)]
    [Column(Order = 6)]
    public string Comments { get; set; }

    public virtual ICollection<Specialties> Specialties { get; set; }
}

そして、これは私の専門テーブル/クラスです:

 public enum Specialty
    {
        Chinees = 0,
        Spanish = 1,
        Etc.. = 2,
    }

    [Table("Specialties")]
    public class Specialties
    {
        [Key]
        [Column(Order = 0)]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [Required]
        [Column(Order = 1)]
        public Specialty Specialty { get; set; } 

        //[Required]
        [MaxLength(20)]
        [Column(Order = 2)]
        public string Name { get; set; } 

        public virtual ICollection<Restaurant> Restaurant { get; set; }
    }

専門テーブルにはデータが事前に入力されています。

これは、多対多の関係のための私のテーブル/クラスです:

[Table("RestaurantSpecialties")]
    public class RestaurantSpecialties
    {
        [Key]
        public int RestaurantId { get; set; }

        [Key]
        public int SpecialtyId { get; set; }

        [ForeignKey("RestaurantId")]
        public virtual Restaurant Restaurant{ get; set; }

        [ForeignKey("SpecialtyId")]
        public virtual Specialties Specialty { get; set; }
    }

私は次のようにFluent Apiモデルを定義しようとしました:

// Primary keys
modelBuilder.Entity<Restaurant>().HasKey(q => q.Id);
modelBuilder.Entity<Specialties>().HasKey(q => q.Id);

// Relationship
modelBuilder.Entity<Restaurant>()
    .HasMany(q => q.Specialties)
    .WithMany(q => q.Restaurant)
    .Map(q =>
    {
        q.ToTable("RestaurantSpecialty");
        q.MapLeftKey("RestaurantId");
        q.MapRightKey("SpecialtyId");
    });

私の Seed 関数では、次のようなデータをシードしています。

context.Specialties.AddOrUpdate(
    p => p.Specialty,
    new Specialties { Specialty = Specialty.Chinees, Name = "Chinees" },
    new Specialties { Specialty = Specialty.Spanish, Name = "Spanish" },
    );

ICollection<Specialties> lstSpecialties = new List<Specialties>();
lstSpecialties.Add(context.Specialties.FirstOrDefault(x => x.Name == "Chinees"));

context.Restaurants.AddOrUpdate(
  p => p.Name,
  new Restaurant{ Name = "Ctr test1", Specialties = lstSpecialties, Comments = "sfasd" },
  new Restaurant{ Name = "Ctr test2", Specialties = lstSpecialties, Comments = "asd" },
  );

しかし、私のテーブル RestaurantSpecialties には何も含まれていません。両方のテーブルの ID が表示されることを期待していました。

私は何を間違っていますか?

[編集]

列挙型は、Gert が提案したように「Specialty」から「RestaurantSpecialty」に名前が変更されました (実際の名前ではなく、名前の変更部分のみ)。

複数クラスの「Specialties」も「Specialty」に名前が変更されました。また、Gert が提案したためです。

結合テーブルもモデルから削除されました。Fluent Apiそれに応じて、元の投稿の一部が更新されました。

Catering(s) は、最初に忘れていた Restaurant(s) に名前が変更されました。混乱を避けるために、元のコード投稿でもこれを行いました。

context.Specialties.AddOrUpdate(
   new Specialty { CateringSpecialty = RestaurantSpecialty.Chinese, Name = "Chinese" },
   new Specialty { CateringSpecialty = CateringSpecialty.Greeks, Name = "Greeks" },
);


var aSpecialty = context.Specialties.FirstOrDefault(x => x.Name == "Chinese");
var restaurant1 = context.Restaurants.Include(c => c.Specialties).FirstOrDefault(x => x.Name == "Ctr test1");

 if (restaurant1 == null)
 {
    restaurant1 = new Restaurant
    {
         Name = "Ctr test4",
         Specialties = new List<Specialty> { aSpecialty },
         Comments = "testtttttttt"
    };
    context.Restaurants.Add(restaurant1);
 }
 else
 {
   if (!restaurant1.Specialties.Any(s => s.Id == aSpecialty.Id))
        restaurant1.Specialties.Add(aSpecialty);

       restaurant1.Name = "Ctr test4";
       restaurant1.Comments = "testtttt";
 }
4

1 に答える 1

1

手動で追加/更新してみてください。AddOrUpdateこのメソッドは、関連するエンティティの完全なオブジェクト グラフの更新をサポートしていないと思われます。おそらく、親エンティティがまだ存在しない場合、関連エンティティを親エンティティと一緒に追加することをサポートしています。ただし、「中国人」専門分野が関連エンティティなしでデータベースに既に存在する場合、関係は更新されない可能性があります。

「手動更新」は次のようになります。

context.Specialties.AddOrUpdate(
    p => p.Specialty,
    new Specialties { Specialty = Specialty.Chinees, Name = "Chinees" },
    new Specialties { Specialty = Specialty.Spanish, Name = "Spanish" },
    );

var chineesSpecialty = context.Specialties
    .FirstOrDefault(x => x.Name == "Chinees");

var catering1 = context.Caterings.Include(c => c.Specialties)
    .FirstOrDefault(x => x.Name == "Ctr test1");

if (catering1 == null)
{
    catering1 = new Catering
    {
        Name = "Ctr test1",
        Specialties = new List<Specialties> { chineesSpecialty },
        Comments = "sfasd"
    };
    context.Caterings.Add(catering1);
}
else
{
    if (!catering1.Specialties.Any(s => s.Id == chineesSpecialty.Id))
        catering1.Specialties.Add(chineesSpecialty);
    catering1.Comments = "sfasd";
}

// and the same for "Ctr test2"

これはこの回答でも言及されていますが、Code-First Migrations の初期のプレビュー リリースであったため、この制限がまだ存在するかどうかはわかりません。しかし、関係テーブルにエントリが取得されない理由は説明できます。

あなたのマッピング自体は私には正しいようです。(しかし、Gert Arnold がコメントで既に推奨しているように、RestaurantSpecialties冗長に見え、モデルを複雑にするだけのエンティティを実際に削除します。)

于 2013-06-18T22:00:32.100 に答える