Asp.net mvc MVC3型号设置-代码优先EF

Asp.net mvc MVC3型号设置-代码优先EF,asp.net-mvc,entity-framework,Asp.net Mvc,Entity Framework,我正试图使用代码优先实体框架在MVC中创建一个火车旅行列表(以及其他内容),我想知道如何映射车站的外键。旅程型号/表格将有一个出发站ID和一个到达站ID,这是链接到一个表格/型号的外键,称为车站 以下是这两种型号的代码: public class Station { public int StationID { get; set; } public string StationName { get; set; } public string Station

我正试图使用代码优先实体框架在MVC中创建一个火车旅行列表(以及其他内容),我想知道如何映射车站的外键。
旅程
型号/表格将有一个
出发站ID
和一个
到达站ID
,这是链接到一个表格/型号的外键,称为
车站

以下是这两种型号的代码:

public class Station
{        
    public int StationID { get; set; }
    public string StationName { get; set; }
    public string StationLocation { get; set; }
}

public class Journey
{
    public int JourneyID { get; set; }
    public int DepartureID { get; set; }
    public int ArrivalID { get; set; }
    public int OperatorID  { get; set; }
    public string JourneyCode { get; set; }

    public virtual Operator Operator { get; set; }
    public virtual Station DepartureStation { get; set; }   
    public virtual Station ArrivalStation { get; set; }    
}
其中还有另一个外键值,即
运算符
,该值已成功映射,但出发点和到达点尚未映射,并且在视图中返回空值:
(@Html.DisplayFor(modeleItem=>item.DepartureStation.StationName)

当我查看数据库时,EF创建了另外两个字段:

DepartureStation_StationID
ArrivalStation_StationID
SQL关系在station表和上面两个字段之间,而不是
DepartureID
ArrivalID

所以,我的问题是-当为两个字段引用同一个表时,我是否需要在模型中做一些不同的操作?我不知道为什么要添加这些额外的字段,所以我假设我的模型设置不正确


感谢您在导航属性中添加以下属性:

public class Journey
{
    public int JourneyID { get; set; }
    public int DepartureID { get; set; }
    public int ArrivalID { get; set; }
    public int OperatorID  { get; set; }
    public string JourneyCode { get; set; }

    [ForeignKey("OperatorID")]
    public virtual Operator Operator { get; set; }
    [ForeignKey("DepartureID")]
    public virtual Station DepartureStation { get; set; }
    [ForeignKey("ArrivalID")]
    public virtual Station ArrivalStation { get; set; }
}
当然,为了应用新的配置,您需要重新生成数据库

public class MyDb : DbContext
{
    public DbSet<Journey> Journeys { get; set; }
    public DbSet<Operator> Operators { get; set; }
    public DbSet<Station> Stations { get; set; }

    protected override void OnModelCreating(DbModelBuilder builder)
    {
        builder.Entity<Journey>()
            .HasRequired(j => j.DepartureStation)
            .WithMany()
            .HasForeignKey(j => j.DepartureID);

        builder.Entity<Journey>()
            .HasRequired(j => j.ArrivalStation)
            .WithMany()
            .HasForeignKey(j => j.ArrivalId);

        // ... Same thing for operator ...

        base.OnModelCreating(builder);
    }
}

希望这会有所帮助。

在导航属性中添加以下属性:

public class Journey
{
    public int JourneyID { get; set; }
    public int DepartureID { get; set; }
    public int ArrivalID { get; set; }
    public int OperatorID  { get; set; }
    public string JourneyCode { get; set; }

    [ForeignKey("OperatorID")]
    public virtual Operator Operator { get; set; }
    [ForeignKey("DepartureID")]
    public virtual Station DepartureStation { get; set; }
    [ForeignKey("ArrivalID")]
    public virtual Station ArrivalStation { get; set; }
}
当然,为了应用新的配置,您需要重新生成数据库

public class MyDb : DbContext
{
    public DbSet<Journey> Journeys { get; set; }
    public DbSet<Operator> Operators { get; set; }
    public DbSet<Station> Stations { get; set; }

    protected override void OnModelCreating(DbModelBuilder builder)
    {
        builder.Entity<Journey>()
            .HasRequired(j => j.DepartureStation)
            .WithMany()
            .HasForeignKey(j => j.DepartureID);

        builder.Entity<Journey>()
            .HasRequired(j => j.ArrivalStation)
            .WithMany()
            .HasForeignKey(j => j.ArrivalId);

        // ... Same thing for operator ...

        base.OnModelCreating(builder);
    }
}

希望这会有所帮助。

为了完整起见,这里的fluent配置也是一样的

public class MyDb : DbContext
{
    public DbSet<Journey> Journeys { get; set; }
    public DbSet<Operator> Operators { get; set; }
    public DbSet<Station> Stations { get; set; }

    protected override void OnModelCreating(DbModelBuilder builder)
    {
        builder.Entity<Journey>()
            .HasRequired(j => j.DepartureStation)
            .WithMany()
            .HasForeignKey(j => j.DepartureID);

        builder.Entity<Journey>()
            .HasRequired(j => j.ArrivalStation)
            .WithMany()
            .HasForeignKey(j => j.ArrivalId);

        // ... Same thing for operator ...

        base.OnModelCreating(builder);
    }
}
公共类MyDb:DbContext
{
公共数据库集行程{get;set;}
公共DbSet运算符{get;set;}
公共数据库集站{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder builder)
{
builder.Entity()
.has必需(j=>j.出发站)
.有很多
.HasForeignKey(j=>j.DepartureID);
builder.Entity()
.HasRequired(j=>j.ArrivalStation)
.有很多
.HasForeignKey(j=>j.lid);
//…接线员也是这样。。。
基于模型创建(生成器);
}
}

编辑:为了解决您对级联删除的上述评论,您可以在
.HasForeignKey()
之后添加
.WillCascadeOnDelete(false)
,这可能会有所帮助(尽管随后您必须手动删除行程记录)

为了完整性,对于流畅的配置,这里也有同样的内容

public class MyDb : DbContext
{
    public DbSet<Journey> Journeys { get; set; }
    public DbSet<Operator> Operators { get; set; }
    public DbSet<Station> Stations { get; set; }

    protected override void OnModelCreating(DbModelBuilder builder)
    {
        builder.Entity<Journey>()
            .HasRequired(j => j.DepartureStation)
            .WithMany()
            .HasForeignKey(j => j.DepartureID);

        builder.Entity<Journey>()
            .HasRequired(j => j.ArrivalStation)
            .WithMany()
            .HasForeignKey(j => j.ArrivalId);

        // ... Same thing for operator ...

        base.OnModelCreating(builder);
    }
}
公共类MyDb:DbContext
{
公共数据库集行程{get;set;}
公共DbSet运算符{get;set;}
公共数据库集站{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder builder)
{
builder.Entity()
.has必需(j=>j.出发站)
.有很多
.HasForeignKey(j=>j.DepartureID);
builder.Entity()
.HasRequired(j=>j.ArrivalStation)
.有很多
.HasForeignKey(j=>j.lid);
//…接线员也是这样。。。
基于模型创建(生成器);
}
}

编辑:要解决您对级联删除的上述评论,您可以在
.HasForeignKey()
之后添加
.WillCascadeOnDelete(false)
,这可能会有所帮助(尽管您随后必须手动删除旅程记录)

您好,谢谢-这看起来不错。不幸的是,它引入了此错误:
在表“旅行”上引入外键约束“旅行”\u DepartureStation可能会导致循环或多个级联路径。请指定“删除无操作”或“更新无操作”,或修改其他外键约束。
我将继续查看此error并尝试找出它,然后报告回来…请参阅下面我的帖子以了解可能的修复方法。对于SQL Server,多级联路径错误是一个令人恼火的错误-他们对此非常保守,而其他数据库则会不顾一切地删除。这可能是因为在旅程中有两个属性指向Station表。删除他对删除进行级联并手动处理。您好,谢谢-这看起来不错。不幸的是,引入了此错误:
在表“Journes”上引入外键约束“Journey\u DepartureStation”可能会导致循环或多个级联路径。请在删除时指定“NO ACTION”,或在更新时指定“NO ACTION”,或修改其他外键约束培训。
我会去调查这个错误,并尝试找出它,然后报告回来……请参阅下面我的帖子,以了解可能的修复方法。SQL Server的多级联路径错误是一个令人恼火的错误-他们对此非常保守,而其他数据库则会不顾一切地删除。它可能来自于Jo中的两个属性urney指向Station表。删除时删除级联,只需手动处理即可。您好,非常感谢-这为我解决了问题。通过添加您编写的内容,再加上
选项。WillCascadeOnDelete(false)
,对初始错误和级联问题进行了排序。非常好。您好,非常感谢-这为我解决了问题。通过添加您编写的内容,再加上选项
。WillCascadeOnDelete(false)
,对初始错误和级联问题进行了排序。非常好。