当前位置: 首页 > 面试题库 >

实体框架4.1-代码优先:多对多关系

湛鸿雪
2023-03-14
问题内容

我想建立这样的关系(一个区域在x个其他区域的附近)

public class Zone
{
    public string Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<ZoneNeighourhood> ZoneNeighourhoods { get; set; }
}

public class ZoneNeighbourhood
{
    public virtual Zone Zone1 { get; set; }
    public virtual Zone Zone2 { get; set; }
}

不幸的是,这是行不通的,因为EF生成的FK不正确…我如何才能使像这样的结构起作用?

3个区域的示例:3 Zones: Zone 1, Zone 2, Zone 3

Zone 1 Neighours:
Zone 2, Zone 3

Zone 2 Neighbours:
Zone 1

Zone 3 Neighbours:
Zone1

有什么建议吗?


问题答案:

您的映射不正确。您正在创建自引用实体,因此需要传入和传出关系的单独集合。单收集是不够的。

public class Zone 
{
    public string Id { get; set; }
    public string Name { get; set; }
    [InverseProperty("NeighbourOf")]
    public virtual ICollection<Zone> NeighbourTo { get; set; }
    [InverseProperty("NeighbourTo")]
    public virtual ICollection<Zone> NeighbourOf { get; set; }
}

除非您还想向该关系添加一些其他属性,否则不需要映射联结表。

如果只希望单个集合,则必须使用流利的映射:

public class Zone 
{
    public string Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Zone> Neighours { get; set; }
}

public class Context : DbContext
{
    public DbSet<Zone> Zones { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Zone>()
                    .HasMany(z => z.Neighbours)
                    .WithMany();
    }
}


 类似资料:
  • 因此,我使用实体框架的“代码优先”方法,并且我有映射文件来映射表信息并添加诸如验证之类的内容,例如: 这是在使用Fluent API,我想知道如何通过字符串而不是T.AccountName获得属性名。我想动态设置这些属性,但我不知道如何通过编程实现。

  • 问题内容: 我有两个表: 通常,我会创建一个映射表’ ‘来将这些表链接成多对多关系。 这是最好的方法吗?我应该将s的列表存储在xml列中,而不是存储在“事件”表中吗? 我使用带有Linq的.NET 3.5 / 4作为DAL(尽管我认为这可能与所提出的设计问题无关)。 有兴趣看看人们的意见是什么。 谢谢。戴夫 问题答案: 映射表绝对是执行此操作的最佳方法-实体框架会将映射表转换为两侧的实体集合,并且

  • 好吧,我知道我对C#和MVC还很陌生,但我正在尝试使用代码优先的方法向数据库中添加项。 现在,我已经成功地为数据库创建了新条目,但当我转到SQL Server时,却找不到数据库或表。 因此,我的问题是,这些数据存储在哪里,因为我无法在SQL Server中看到它,就像我手动创建的其他数据库一样? 我的ConnectionString是:

  • 问题内容: 在这些多重性冲突中,我所看到的大多数其他问题都是代码优先的,而我将DB作为第一位。我进行了一些模式更改,并且从数据库刷新模型时出现以下错误: 多重性与关系“ FK_MarketSelectionWager_Bet”中的角色“赌注”中的引用约束冲突。由于从属角色中的所有属性都是不可为空的,因此,主体角色的多重性必须为“ 1”。 我需要在SQL或模型中进行修复的任何指针都很棒。 以下是涉及

  • 我对Entity Framework 6非常陌生,我想在我的项目中实现存储过程。我有一个存储过程,如下所示: 班级: 我的问题是:如何调用存储过程并向其中传递参数?

  • 问题内容: 我首先在我的项目中使用EF代码。我的DataModel中有以下代码 为了使该值不为空,我删除了“?” 并从“程序包管理器”控制台中运行“添加迁移”命令。以下迁移文件已生成。 但是当我运行Update-Database命令时: 我收到以下错误:无法将值NULL插入表“’‘的“ PasswordDate”列中;列不允许为空。UPDATE失败。该语句已终止。 请提出解决方案。 问题答案: 那