我有一张桌子旅行者:
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都必须引用一个唯一的模式和表。
我该如何解决这个问题? 提前谢谢!
答案 0 :(得分:1)
你做不到。 EF不支持多次映射表,并且表映射表示多对多关系。因此,你不能在两个不同的多对多关系中使用该表(即使它们实际上是相同的,但EF不知道它)。
重用关系的唯一方法是通过继承,但这在你的模型中是没有意义的,它可能会引起你另一个问题。