3

我正在尝试通过 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 文件完美管理,因此问题仅与映射有关。

4

1 回答 1

3

这样的事情会(几乎)为您提供所需的架构,但需要注意: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);
    }
}

由于我在此处解释的错误,我不得不关闭身份生成。

于 2011-02-17T04:07:14.840 回答