实体框架4.2:使用相同多对多关系的多个实体

时间:2012-02-14 10:28:25

标签: entity-framework entity-framework-4 poco fluent

我有一张桌子旅行者

CREATE TABLE [dbo].[Travelers](
    [TravelerId] [int] IDENTITY(1,1) NOT NULL,
    [FirstName] [nvarchar](25) NULL,
    [LastName] [nvarchar](50) NULL

运输商和联接表 TransporterTravelers

CREATE TABLE [dbo].[TransporterTravelers](
    [Transporter_TransporterId] [int] NOT NULL,
    [Traveler_TravelerId] [int] NOT NULL,

在旅行者和运输者之间建立多对多的关系。我使用POCO类创建实体Traveler和Transporter,并自动创建连接表(使用CreateDatabaseIfNotExists初始化程序)。随着项目的进展,我们开始自动创建数据库,因为数据库现在已经填充了数据。最近我们添加了一个视图vwTravelersSummary来加速,使用内/左连接来解决Travelers表和其他几个表:

CREATE view [dbo].[vwTravelersSummary] as
SELECT
    tr.[TravelerId],
    tr.[FirstName],
    tr.[LastName],

    adr.[Street],
    adr.[Number], 
    adr.[PostalCode],
    adr.[Town],
FROM
    [dbo].[Travelers] tr
    LEFT JOIN (...)

我创建了一个映射到此视图的POCO类:

[DataServiceKey("TravelerId")]
[MetadataType(typeof(TravelerSummaryMeta))]
[Table("vwTravelersSummary")]
public class TravelerSummary
{
    public TravelerSummary()
    {
    }

    [Key]
    public int TravelerId { get; set; }
    ... 
    public string Street { get; set; }
    public int? Number { get; set; }
    public string PostalCode { get; set; }
    public string Town { get; set; }
}

我还需要这个实体和传输器之间的多对多关系(我们使用的是Data Services,我们在查询拦截器中需要这种关系)。所以我添加了以下Fluent API调用:

modelBuilder.Entity<TravelerSummary>()
    .HasMany(ts => ts.Transporters)
    .WithMany(/* No navigation from Transporter to TravelersSummary */)
    .Map(mc =>
        {
            mc.ToTable("TransporterTravelers");
            mc.MapLeftKey("Traveler_TravelerId");
            mc.MapRightKey("Transporter_TransporterId");
        }
    );

一切似乎都有效,但......旅行者和运输者之间最初的多对多关系现在已经瘫痪了。 EF现在响应错误:

  

无效的对象名称'dbo.TransporterTravelers1'。

(由于基于约定的命名?)。因此,我明确指出了旅行者和运输者之间原始的多对多关系:

modelBuilder.Entity<Traveler>()
    .HasMany(t => t.Transporters)
    .WithMany(tr => tr.Travelers)
    .Map(mc =>
    {
        mc.ToTable("TransporterTravelers");
        mc.MapLeftKey("Traveler_TravelerId");
        mc.MapRightKey("Transporter_TransporterId");
    }
    );

现在我收到以下错误:

  

指定的架构无效。错误:   (2219,6):错误0019:EntitySet'TravelerSummaryTransporter'   使用架构'dbo'和表'TransporterTravelers'已经   定义。每个EntitySet都必须引用一个唯一的模式和表。

我该如何解决这个问题? 提前谢谢!

1 个答案:

答案 0 :(得分:1)

你做不到。 EF不支持多次映射表,并且表映射表示多对多关系。因此,你不能在两个不同的多对多关系中使用该表(即使它们实际上是相同的,但EF不知道它)。

重用关系的唯一方法是通过继承,但这在你的模型中是没有意义的,它可能会引起你另一个问题。