C# 将关系视为列的实体框架

C# 将关系视为列的实体框架,c#,database,entity-framework-6,C#,Database,Entity Framework 6,我试图使用EF6.0创建一个DB First模型,但遇到了一个问题。一些应该被解释为导航属性的关系似乎被解释为简单列。这导致生成的SQL出现问题,称为“无效列名”,但是,它应该尝试使用外键标识符连接到列中指示的表名。以下是生成的POCO,让您了解我们正在处理的问题: public partial class MyIntersection { public string Id { get; set; } public string AddressId { get; set; }

我试图使用EF6.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; }
}
所涉及的实体是地址与帐户或地址与联系人之间的关系。但是,这两种状态是互斥的,数据中只会建模一种关系。它看起来像这样:

{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]}
    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);
    }

外键已在数据库中创建,并且似乎正在运行,但当我尝试访问模型时,生成的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]}
    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);
    }

我已经确保添加了一个额外的专栏,以避免任何关系不明确的问题,但我仍然没有看到预期的行为。非常感谢您的帮助。

我在这里找到了问题所在。事实证明,我混合了我的EF方法,给自己带来了问题。我已经完成了一个DB-first模型,并完成了一个EDMX,但我通过了自己的连接(以便在测试、产品等之间轻松切换)。事实证明,这样做让我进入了代码优先模式,我不得不使用fluentapi来定义我的关系。它看起来像这样:

{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]}
    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);
    }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.HasMany(e=>e.mycross)
.WithOptional(e=>e.Contact)
.HasForeignKey(e=>e.ContactId);
modelBuilder.Entity()
.HasMany(e=>e.mycross)
.with可选(e=>e.Account)
.HasForeignKey(e=>e.AccountId);
modelBuilder.Entity()
.HasMany(e=>e.mycross)
.WithRequired(e=>e.Address)
.HasForeignKey(e=>e.AddressId)
.WillCascadeOnDelete(假);
}
吸取教训