2016-08-18 4 views
1

Entity Frameworkの外部キーとマッピングに関する簡単な質問があります。別のアセンブリでエンティティフレームワークの単純な外部キー

public interface IUser 
{ 
    int Id { get; set; } 
}  
public class RestaurantGuest : IUser 
{ 
    public int Id { get; set; } 
} 

とクラス訪問、外部キーによってRestaurantGuestへの参照を持つべきである: は例えば、私はクラスRestaurantGuestを持って

public class Visit 
{ 
     public int Id { get; set; } 
     public IUser Guest { get; set; } 
     public int GuestId { get; set; } 
} 

RestaurantGuestclassはないと持つべきではありませんan IList<Visit> Visits {get;set;}

エンティティフレームワークでどのようにマップするのですか?

私はこのような何か(それは動作しません)予想:私はのリストを追加したくない

builder.VersionedEntity<RestaurantGuest>() 
     .HasMany(o => o.Visits) 
     .WithRequired(v => v.Guest) 
     .HasForeignKey(v => v.GuestId); 

builder.VersionedEntity<Visit>().ToTable("Visits") 
     .WithRequired(v => v.Guest).ToTable("RestaurantGuests") 
     .HasForeignKey(o => o.GuestId) 

を除いてすべてのチュートリアルはこれを行うことをお勧めしますレストランゲストへの訪問。 RestaurantGuestは訪問について何も知らないはずです。

+0

あなたは流暢なAPIの設定なしにしようとしましたか?命名規則に従って、このモデルは設定なしで期待どおりに動作します。 – Developer

+0

愚かな質問のために私を許してください。しかし、 'VersionedEntity'メソッドは何ですか?私はエンティティフレームワークでそのようなメソッドを知らない、NHibernateについて話している? –

+0

@IvaStoev Entity Frameworkのメソッドです。私はNHibernateで欲しいものをする方法を知っています))しかし、今はEntity Frameworkを持っており、わかっているように回避策なしでは不可能です。 – Konstantin

答えて

0

あなたのGuestは実際にはInterfaceなので、私はそれを直接マップすることはできません。なぜなら、まずは常にRestaurantGuestであるとは思わないからです。

私はこのような工場を使って好き:あなたはあなたのケースRestaurantGuestには、適切な具象クラスをインスタンス化する必要があるものは何でもロジック適用、build方法インサイド

public interface IUser 
{ 
    int Id { get; set; } 
} 

public class RestaurantGuest : IUser 
{ 
    public int Id { get; set; } 
} 

public class Visit 
{ 
    public int Id { get; set; } 
    public virtual GuestFactory Guest { get; set; } 
    public int GuestId { get; set; } 
} 

public class GuestFactory: IUser 
{ 
    public int Id { get; set; } 

    public IUser Build() 
    { 
     return new RestaurantGuest { Id = this.Id }; 
    } 
} 

builder.VersionedEntity().HasMany() 
     .WithRequired(v => v.Restaurant).HasForeignKey(v => v.RestaurantId); 

。あなたはこのようにそれを設定する:あなたはこのの移行を実行したときに

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

     modelBuilder.Entity<GuestFactory>().ToTable("RestaurantGuest"); 

     modelBuilder.Entity<Visit>() 
      .HasRequired(v => v.Guest) 
      .WithMany() 
      .HasForeignKey(v => v.GuestId); 

    } 

そして、これが出力されます。

public partial class RestaurantTest : DbMigration 
{ 
    public override void Up() 
    { 
     CreateTable(
      "dbo.RestaurantGuest", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
       }) 
      .PrimaryKey(t => t.Id); 

     CreateTable(
      "dbo.Visits", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        GuestId = c.Int(nullable: false), 
       }) 
      .PrimaryKey(t => t.Id) 
      .ForeignKey("dbo.RestaurantGuest", t => t.GuestId, cascadeDelete: true) 
      .Index(t => t.GuestId); 

    } 

    public override void Down() 
    { 
     DropForeignKey("dbo.Visits", "GuestId", "dbo.RestaurantGuest"); 
     DropIndex("dbo.Visits", new[] { "GuestId" }); 
     DropTable("dbo.Visits"); 
     DropTable("dbo.RestaurantGuest"); 
    } 
} 
+0

申し訳ありませんが、最初は悪い例でした。もう一度質問をしてください。 – Konstantin

+0

ああ、今私はあなたが望むものを理解した。 – Alisson

+0

@ Constantin私は自分の答えを更新したので、あなたのニーズに合っています。 Entity Frameworkがインターフェイスであるため、Entity Frameworkが自動的にインスタンス化することは不可能であり、具体的なクラスを使用するかどうかはわかりませんので、回避策として工場を使用しました。クラスとしてゲストとしてインスタントします。これがあなたに役立つかどうか、さらに質問があれば教えてください。 – Alisson

関連する問題