我有一个用于存储这种关系的通用表:
CREATE TABLE Relationship (
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[FromMemberID] [bigint] NOT NULL,
[FromMemberType] [varchar](255) NOT NULL,
[ToMemberID] [bigint] NOT NULL,
[ToMemberType] [varchar](255) NOT NULL,
[RoleDescriptorID] [bigint] NULL)
我还有其他一些参与关系的表格:
CREATE TABLE Company (
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](255) NOT NULL)
CREATE TABLE Person (
[ID] [bigint] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](255) NOT NULL,
[Email] [nvarchar](255) NOT NULL)
etc.
所以关系存储如下:
ID | FromMemberID | FromMemberType | ToMemberID | ToMemberType | RoleDescriptorID
---------------------------------------------------------------------------------
1 | 1 | Person | 1 | Company | 1 (Contractor)
1 | 2 | Person | 1 | Company | 2 (Employee)
1 | 2 | Company | 1 | Company | 3 (Customer)
如何在Entity Framework模型中表示它,以便我可以轻松地处理每个实体关系?例如,我希望能够这样做:
company.Relationships.ToList()
选择从公司到所有人的所有关系
其他实体(我可以通过创建一个视图并通过关联在模型EF中映射它来实现)company.Relationships.Add(..); context.SaveChanges()
为公司添加新关系并能够保存。这是棘手的部分。有什么建议吗? (我必须继续使用这个表结构)
答案 0 :(得分:1)
您必须完全按照在数据库中定义的方式使用它。您将拥有Company
实体,Person
实体,Relationship
实体,并且您所有的真实关系将在最后提到的实体中保持为字符串。
实体框架依赖于正确的(假设的)数据库体系结构,并且它不提供数据驱动的映射。一旦涉及到这样的任何数据库级抽象,您将无法通过实体框架将其分解回所谓的概念模型。您需要从数据库视图和存储过程构建全新的数据库层,以便在EF和您的设计期望的设计之间建立桥梁。只有在这个桥接SQL之后,您才能使用company.Relationships