C# 将关系视为列的实体框架
我试图使用EF6.0创建一个DB First模型,但遇到了一个问题。一些应该被解释为导航属性的关系似乎被解释为简单列。这导致生成的SQL出现问题,称为“无效列名”,但是,它应该尝试使用外键标识符连接到列中指示的表名。以下是生成的POCO,让您了解我们正在处理的问题: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; }
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(假);
}
吸取教训