Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架中的简单外键_C#_Entity Framework - Fatal编程技术网

C# 实体框架中的简单外键

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

我有一个关于实体框架中外键和映射的简单问题。 例如,我有一个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访问{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中做我想做的事情),但现在我们有了实体框架,而且据我所知,如果没有变通方法,就不可能做到这一点。