实体框架将关系视为列

时间:2016-02-15 03:21:50

标签: c# database entity-framework-6

我试图使用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; }
}

有问题的实体是地址和帐户或地址和联系人之间的关系。但是,这两个状态是互斥的,只有一种关系将在数据中建模。它看起来像这样:

Sample intersection record

外键已在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]}

我确保添加一个额外的列以避免任何与模糊关系的问题,但我仍然没有看到我期望的行为。任何帮助表示赞赏。

1 个答案:

答案 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);
    }

经验教训!