[英]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.