C# 实体框架中的简单外键
我有一个关于实体框架中外键和映射的简单问题。 例如,我有一个RestaurantGuest类:C# 实体框架中的简单外键,c#,entity-framework,C#,Entity Framework,我有一个关于实体框架中外键和映射的简单问题。 例如,我有一个RestaurantGuest类: public interface IUser { int Id { get; set; } } public class RestaurantGuest : IUser { public int Id { get; set; } } 以及在另一个集合中的课堂参观,该集合应通过外键引用RestaurantGuest: public class Visit { p
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访问{get;set;}
如何在实体框架中映射它
我期待这样的事情(但它不起作用):
builder.VersionedEntity().ToTable(“访问”)
.WithRequired(v=>v.Guest).可折叠(“RestaurantGuests”)
.HasForeignKey(o=>o.GuestId)
但所有教程都建议您这样做:
builder.VersionedEntity<RestaurantGuest>()
.HasMany(o => o.Visits)
.WithRequired(v => v.Guest)
.HasForeignKey(v => v.GuestId);
builder.VersionedEntity()
.HasMany(o=>o.visions)
.WithRequired(v=>v.Guest)
.HasForeignKey(v=>v.GuestId);
我不想把去餐馆的次数加在一起。RestaurantGuest不应该知道关于访问的任何信息。因为您的
来宾
实际上是一个界面,我想您不能直接映射它,因为首先您甚至不能假设它始终是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);
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<GuestFactory>().ToTable("RestaurantGuest");
modelBuilder.Entity<Visit>()
.HasRequired(v => v.Guest)
.WithMany()
.HasForeignKey(v => v.GuestId);
}
在build
方法中,您可以应用实例化适当的具体类所需的任何逻辑,例如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);
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<GuestFactory>().ToTable("RestaurantGuest");
modelBuilder.Entity<Visit>()
.HasRequired(v => v.Guest)
.WithMany()
.HasForeignKey(v => v.GuestId);
}
因为你的
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);
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<GuestFactory>().ToTable("RestaurantGuest");
modelBuilder.Entity<Visit>()
.HasRequired(v => v.Guest)
.WithMany()
.HasForeignKey(v => v.GuestId);
}
在build
方法中,您可以应用实例化适当的具体类所需的任何逻辑,例如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);
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<GuestFactory>().ToTable("RestaurantGuest");
modelBuilder.Entity<Visit>()
.HasRequired(v => v.Guest)
.WithMany()
.HasForeignKey(v => v.GuestId);
}
对不起,我第一次举了个坏例子。请再看看这个问题。哦,现在我明白你想要什么了。@Konstantin我已经更新了我的答案,所以它适合你的需要。请注意,Entity Framework不可能自动实例化您的来宾,因为它是一个接口,并且它不知道要使用什么具体类,这就是为什么我使用工厂作为解决方法,因为您是唯一知道作为来宾实例化什么具体类的人。让我知道这是否对你有帮助,如果你还有其他问题。@Konstantin这对你有帮助吗?如果是的话,你可以考虑把我的答案标记为“接受”。如果没有,请告诉我您发现了什么问题。对不起,我第一次遇到了一个坏例子。请再看看这个问题。哦,现在我明白你想要什么了。@Konstantin我已经更新了我的答案,所以它适合你的需要。请注意,Entity Framework不可能自动实例化您的来宾,因为它是一个接口,并且它不知道要使用什么具体类,这就是为什么我使用工厂作为解决方法,因为您是唯一知道作为来宾实例化什么具体类的人。让我知道这是否对你有帮助,如果你还有其他问题。@Konstantin这对你有帮助吗?如果是的话,你可以考虑把我的答案标记为“接受”。如果没有,请告诉我您发现了什么问题。您是否尝试过不使用fluent API配置?根据命名约定,此模型在没有任何配置的情况下将按预期工作。请原谅这个愚蠢的问题,但是
VersionedEntity
方法是什么?我不知道实体框架中有这样的方法,你说的是NHibernate?@ivastev,它是实体框架方法。我知道如何在NHibernate中实现我想要的功能),但现在我们有了实体框架,据我所知,如果没有解决方法,就不可能实现它。您是否尝试过在没有fluent API配置的情况下实现它?根据命名约定,此模型在没有任何配置的情况下将按预期工作。请原谅这个愚蠢的问题,但是VersionedEntity
方法是什么?我不知道实体框架中有这样的方法,你说的是NHibernate?@ivastev,它是实体框架方法。我知道如何在NHibernate中做我想做的事情),但现在我们有了实体框架,而且据我所知,如果没有变通方法,就不可能做到这一点。