繁体   English   中英

实体框架中的简单外键

[英]Simple foreign key in entity framework

我有一个关于外键和实体框架中的映射的简单问题。 例如,我有一个类RestaurantGuest:

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

和类访问另一个程序集,应该通过外键引用RestaurantGuest:

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

RestaurantGuestclass不会也不应该有IList<Visit> Visits {get;set;}

如何在实体框架中映射它?

我期待这样的事情(但它不起作用):

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

但是所有教程都建议这样做:

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

我不想在RestaurantGuest中添加访问列表。 RestaurantGuest不应该对访问有任何了解。

由于您的Guest实际上是一个界面,我猜您无法直接映射它,因为首先您甚至不能假设它始终是一个RestaurantGuest。

我喜欢这样的工厂:

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);

build方法中,您应用所需的任何逻辑来实例化适当的具体类,在您的情况下是一个RestaurantGuest 你这样配置:

    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");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM