【问题标题】:Entity Framework's DbModel: How to map a one to many relationship using a connection table?实体框架数据库模型:如何使用连接表映射一对多关系?
【发布时间】:2011-02-15 09:14:13
【问题描述】:

我正在尝试通过 DbModel 映射数据库中存在的这种关系。

CREATE TABLE core.Institutes 
(
    ID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    Name NVARCHAR(128) NOT NULL,
    OldID INT NULL
)
GO

CREATE TABLE core.InstitutePlaces
(
    FKInstituteID INT NOT NULL PRIMARY KEY REFERENCES core.Institutes(ID),
    FKPlaceID INT NOT NULL REFERENCES core.Places(ID)
)
GO

CREATE TABLE core.Places
(
    ID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    Name NVARCHAR(128) NOT NULL,
    FKParentID INT NULL REFERENCES core.Places(ID),
    OldID INT NULL
)
GO

在这个模型上

public class Place
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }
    public Place Parent { get; set; }
}

public class Institute
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Place Place { get; set; }
}

我们正在使用类似的东西来进行映射

modelBuilder.Entity<Institutes.Institute>().HasOptional(i => i.Place);

但它不起作用:(

这个场景完全由 EDML 文件管理,所以问题只在于映射。

【问题讨论】:

  • 我相信你的模型可以让 1 到 * 工作,导航属性需要是 ICollection Institutes {get; set;},要启用延迟加载,请将属性设为虚拟。这是一个关于 EFCF CPT5 的好博客 weblogs.asp.net/manavi/default.aspx
  • 谢谢,但我们希望避免使用从 Place 到 Institutes 的导航属性,因为它对我们从 Place 到其 Institute 或与该特定地点链接的其他实体没有任何意义.

标签: code-first entity-framework-ctp5


【解决方案1】:

这样的事情会(几乎)为您提供所需的架构,但需要注意:Code First 不会在您所需架构(使用连接表创建 1:* 关联)的实体拆分场景中创建 1:1 关系它的一个特例。

public class Place
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }
    public Place Parent { get; set; }
}

public class Institute
{
    [DatabaseGenerated(DatabaseGenerationOption.None)]
    public int Id { get; set; }
    public string Name { get; set; }

    public int? PlaceId { get; set; }
    public Place Place { get; set; }
}

public class Context : DbContext
{
    public DbSet<Place> Places { get; set; }
    public DbSet<Institute> Institutes { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Institute>().Map(mc =>
        {
            mc.Properties(p => new { p.Id, p.Name });
            mc.ToTable("Institutes");
        })
        .Map(mc =>
        {
            mc.Properties(p => new { p.Id, p.PlaceId });
            mc.ToTable("InstitutePlaces");
        });

        modelBuilder.Entity<Place>()
                    .HasOptional(p => p.Parent)
                    .WithMany()
                    .HasForeignKey(p => p.ParentId);
    }
}

由于我解释过 here 的错误,我不得不关闭身份生成。

【讨论】:

  • 感谢您的回答!我没有考虑使用实体拆分。 :)
  • 没问题,很高兴我能为您的至少一个问题提供真正的答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
相关资源
最近更新 更多