我试图使用EF 6.0创建一个DB-First模型,而我遇到了一个问题。似乎应该解释导航属性的一些关系被解释为简单列。这导致生成的SQL中出现问题"无效的列名称"但是,它应该尝试使用外键标识符连接到列中指示的表名。这是生成的POCO,用于了解我们正在处理的内容:
public partial class MyIntersection
{
public string Id { get; set; }
public string AddressId { get; set; }
public string AccountId { get; set; }
public string ContactId { get; set; }
public virtual Account Account { get; set; }
public virtual Address Address { get; set; }
public virtual Contact Contact { get; set; }
}
有问题的实体是地址和帐户或地址和联系人之间的关系。但是,这两个状态是互斥的,只有一种关系将在数据中建模。它看起来像这样:
外键已在DB中创建并且似乎正在运行,但是当我尝试访问模型时,生成的SQL如下所示:
{SELECT
1 AS [C1],
[Extent1].[Id] AS [Id],
[Extent1].[AddressId] AS [AddressId],
[Extent1].[AccountId] AS [AccountId],
[Extent1].[ContactId] AS [ContactId],
[Extent1].[Accounts_AccountId] AS [Account_AccountId],
[Extent1].[Addresses_AddressId] AS [Addresses_AddressId],
[Extent1].[Contacts_ContactId] AS [Contacts_ContactId]
FROM [dbo].[MyIntersections] AS [Extent1]}
我确保添加一个额外的列以避免任何与模糊关系的问题,但我仍然没有看到我期望的行为。任何帮助表示赞赏。
答案 0 :(得分:0)
我在这里发现了这个问题。事实证明,我正在混合我的EF方法,并为我自己造成了问题。我做了一个DB第一个模型,完成了EDMX,但我正在通过我自己的连接(轻松切换测试,prod等)。事实证明,这样做让我进入了代码优先模式,我不得不使用流畅的API来定义我的关系。它看起来像这样:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Contact>()
.HasMany(e => e.MyIntersections)
.WithOptional(e => e.Contact)
.HasForeignKey(e => e.ContactId);
modelBuilder.Entity<Account>()
.HasMany(e => e.MyIntersections)
.WithOptional(e => e.Account)
.HasForeignKey(e => e.AccountId);
modelBuilder.Entity<Address>()
.HasMany(e => e.MyIntersections)
.WithRequired(e => e.Address)
.HasForeignKey(e => e.AddressId)
.WillCascadeOnDelete(false);
}
经验教训!