好吧显然我在这里打网...答案可能就是我正在咆哮错误的树,应该继续使用我5年前的那种数据库设计。
我想要的是拥有一个抽象对象客户端并拥有2个继承对象供应商和客户。
客户与供应商和客户之间的关系是1:0/1
这似乎意味着基于继承的解决方案可以很好地工作,因为它可以让我编写更少的验证代码以及强大的类型集合。
然而,开箱即用的实体框架坚持在客户端表上使用唯一ID,并拒绝让您从Customer和supplier表中引用相同的id。
当你进入数据库并手动编辑这个id在两个继承的对象上都是相同的时候你会遇到问题,因为客户端的集合有一个索引冲突(毫无疑问)。
结果是我不能让客户同时出现供应商和客户(我对2个单独对象共享相同ID的想法很满意。)
这导致了如何最好地模拟这种情况的设计问题......我有可能不得不为'isCustomer','isSupplier'或连接到的供应商和客户表执行条件连接和布尔字段客户端和编写代码以保持与它的0-1关系。
其他人必须遇到这种问题吗?没有优雅的解决方案?
替代方案: 我需要同一个对象的多个视图。这意味着我不能简单地在一个字段上有一个整数值来确定允许哪些视图。我需要使用几个bool字段来确定允许的对象视图。
这可能在EF吗?显然我可以在数据库中创建视图,但是id而不是从EF执行此操作并让它创建SQL。 (虽然我已经定义了sp来设置数据库中的各种键和约束,但这意味着我越来越倾向于放弃使用EF来生成我的模式)
答案 0 :(得分:1)
不幸的是,你所要求的并不是真的可能。 .NET不允许多重继承,因此这不是(也不会是)EF或任何其他ORM的功能。
您必须删除EF设计器中的继承,并且只允许表之间的正常1:1 *关联。
您最终会得到您正在寻找的数据库设计,并且您的C#语法将如下所示:
Client c;
c.Customer.[...]
c.Supplier.[...]
答案 1 :(得分:0)
将客户和供应商的共同点放在客户端,只包含客户客户特有的东西,特定于供应商供应商的东西。
3个表,3种类型的对象。
答案 2 :(得分:0)
我知道这篇文章,如果EF 5岁还没有解决这个问题......
也许我错过了一些东西,但EF不会让多个孩子从一个父母那里继承而且DotNet完全有能力做到这一点。我可以通过将每个实体更改为部分类,然后定义每个部分类实现的接口来解决它。这太荒谬了。我们数据库中的每个表都有4列:CreatedBy,CreatedOn,UpdatedBy,UpdatedOn。如果我在实体框架中创建一个抽象类,我应该能够从这个抽象类继承每个实体,这样每个实体都有这四个字段。但你不能。只有一个表可以从抽象类继承。这没有道理。它完全违背了抽象类的目的。我希望每个实体都有这四个领域,但只有一个孩子可以拥有它们。公司应该有这四个领域。设施,公司的子女,也应该有这四个领域。但不,不能做到。即使TimeStampTable是一个抽象类,只有一个表可以继承,只有一个表可以获得四个字段
这是实体图
.....无论如何,我感觉到你的痛苦并且有一种解决方法。创建所需的接口,将实体更改为部分类,然后在单独的文件中为每个实体继承该接口的部分类,
您必须在每个分部类文件中手动实现该接口。
祝你好运(或找到另一个ORM)