C# EF6代码优先:具有多个关系的实体

C# EF6代码优先:具有多个关系的实体,c#,.net,vb.net,entity-framework,entity-framework-6,C#,.net,Vb.net,Entity Framework,Entity Framework 6,我首先使用EF代码创建一个新数据库,其中包含以下类: Address, Contact, Account, Customer (a sub-class of Account), and SalesOrder. Address类是目前给我带来问题的类,它可以没有外键,因为它可以链接到其他五个类中的任何一个(还有更多),并且其他每个类都可以有一个或多个指向它的导航属性 导航属性应如下所示: Contact.AddressId? Contact.Address Account.AddressId

我首先使用EF代码创建一个新数据库,其中包含以下类:

Address, Contact, Account, Customer (a sub-class of Account), and SalesOrder. 
Address类是目前给我带来问题的类,它可以没有外键,因为它可以链接到其他五个类中的任何一个(还有更多),并且其他每个类都可以有一个或多个指向它的导航属性

导航属性应如下所示:

Contact.AddressId?
Contact.Address

Account.AddressId?
Account.Address

Customer.DeliveryAddresses

SalesOrder.InvoiceAddressId
SalesOrder.InvoiceAddress

SalesOrder.DeliveryAddressId?
SalesOrder.DeliveryAddress
这些类应该可以共享相同的地址记录,例如,一个帐户有一个地址,该地址也可以链接到SalesOrder,链接到客户的不同地址可以链接到另一个SalesOrder。所有链接到帐户和客户的地址都应该是唯一的,但是其他类应该能够共享到这些地址的链接

我试着用我能想到的所有可能的fluent配置来设置它,我的DbContext有一个DbSet属性,没有(最终,我认为它不应该有自己的DbSet属性,因为地址应该只能从各种根对象访问,但如果这是让它工作的唯一方法,我很乐意自己管理插入/删除)

我尝试将所有导航属性设置为可空(理想情况下SalesOrder.InvoiceAddressId不应为空),并且还必须一次性删除Customer.DeliveryAddresses多对多映射,因为这会混淆问题

根据设置方式的不同,我会出现各种错误,可能是由于不可为null的字段导致的多重性冲突,也可能是在没有DbSet属性的情况下发生的级联删除错误,我尝试让EF处理插入和删除

当我设置了DbSet属性时,我也会得到不需要的空行。例如:

add three Address records to the DbSet (Address(1), Address(2), Address(3),
add two Accounts to the DbSet (Account(1) & Account(2)),
add multiple SalesOrders,
set Account(1).AddressId = 1
set Account(2).AddressId = 2, 
set SalesOrder(n).InvoiceAddressId = 1,
set SalesOrder(n).DeliveryAddressId = 3
这将正确创建地址记录,但只有在使用各种Id外键属性而不是导航属性时,才会正确设置相关的键,并且即使使用了Id属性,外键看起来都是正确的,但每个SalesOrder的记录都是孤立的(如果使用了两个导航属性,则每个订单两个)在我的地址表中结束,其所有字段的bar Id设置为NULL

我能想到的唯一一件我没有尝试过的事情是创建多个子类Address,并将每个子类与它的相关类(例如SalesOrderDeliveryAddress)一起使用,但这似乎并不理想。除非我必须这样做,否则我宁愿不这样做

我正在寻找的东西是否可以在EF中设置,或者是否有其他方法可以实现

谢谢,
David

有几个问题使这一点令人困惑。首先,我会在删除时关闭默认的级联,以摆脱多个级联路径,稍后再讨论这个问题

然后在此处阅读有关添加断开连接的树、外键和导航属性的内容:

然后我会按照你想要的方式设置实体,并转发一个更具体的问题。(你已经尝试了很多东西,所以很难弄清楚在这里会发生什么)


添加和更新工作完成后,您可以返回并确定可以将级联删除放在何处,以及需要手动删除的位置。有几个问题使这一点令人困惑。首先,我将在删除时关闭默认级联,以摆脱多个级联路径,稍后再返回

然后在此处阅读有关添加断开连接的树、外键和导航属性的内容:

然后我会按照你想要的方式设置实体,并转发一个更具体的问题。(你已经尝试了很多东西,所以很难弄清楚在这里会发生什么)


添加和更新工作完成后,您可以返回并确定可以将cascade delete放在何处,以及需要手动删除的位置

我实际上已经在使用外键属性来设置对象之间的链接(如文章中所述),有趣的是,改为相反的方式(设置导航属性)似乎已经修复了重复的空行。我还为所有内容禁用了Cascade On Delete,目前一切似乎都正常。我实际上已经在使用外键属性设置对象之间的链接(如那篇文章所述),有趣的是,更改为相反的方式(设置导航属性)似乎已经修复了重复的空行。我还为所有内容禁用了Cascade On Delete,目前看来一切正常。