实体框架映射问题

时间:2009-06-20 14:04:24

标签: entity-framework orm

尝试使用实体框架映射以下架构。

  • 客户可以拥有许多相关商店。
  • 商店可以有许多关联的客户
  • 每个商店可以有0个或1个且只有1个TopCustomer(在商业逻辑中确定要成为TopCustomer的标准)

alt text

这导致VS中的以下映射。

alt text


这是DB脚本:


USE [TestDb]
GO
/****** Object:  Table [dbo].[Customer]    Script Date: 06/20/2009 09:53:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Customer](
    [CustomerId] [uniqueidentifier] NOT NULL,
    [FirstName] [nvarchar](50) NOT NULL,
    [LastName] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED 
(
    [CustomerId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[Store]    Script Date: 06/20/2009 09:53:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Store](
    [StoreId] [uniqueidentifier] NOT NULL,
    [StoreName] [nvarchar](50) NOT NULL,
    [TopCustomer] [uniqueidentifier] NULL,
 CONSTRAINT [PK_Store] PRIMARY KEY CLUSTERED 
(
    [StoreId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[CustomerStore]    Script Date: 06/20/2009 09:53:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[CustomerStore](
    [CustomerId] [uniqueidentifier] NOT NULL,
    [StoreId] [uniqueidentifier] NOT NULL,
 CONSTRAINT [PK_CustomerStore] PRIMARY KEY CLUSTERED 
(
    [CustomerId] ASC,
    [StoreId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  ForeignKey [FK_CustomerStore_Customer]    Script Date: 06/20/2009 09:53:52 ******/
ALTER TABLE [dbo].[CustomerStore]  WITH CHECK ADD  CONSTRAINT [FK_CustomerStore_Customer] FOREIGN KEY([CustomerId])
REFERENCES [dbo].[Customer] ([CustomerId])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[CustomerStore] CHECK CONSTRAINT [FK_CustomerStore_Customer]
GO
/****** Object:  ForeignKey [FK_CustomerStore_Store]    Script Date: 06/20/2009 09:53:52 ******/
ALTER TABLE [dbo].[CustomerStore]  WITH CHECK ADD  CONSTRAINT [FK_CustomerStore_Store] FOREIGN KEY([StoreId])
REFERENCES [dbo].[Store] ([StoreId])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[CustomerStore] CHECK CONSTRAINT [FK_CustomerStore_Store]
GO
/****** Object:  ForeignKey [FK_Store_TopCustomer]    Script Date: 06/20/2009 09:53:52 ******/
ALTER TABLE [dbo].[Store]  WITH CHECK ADD  CONSTRAINT [FK_Store_TopCustomer] FOREIGN KEY([TopCustomer])
REFERENCES [dbo].[Customer] ([CustomerId])
GO
ALTER TABLE [dbo].[Store] CHECK CONSTRAINT [FK_Store_TopCustomer]
GO


问题:

如何在不在Customer类上创建额外导航属性的情况下将TopCustomer关联映射到Customer的单个实例?

1 个答案:

答案 0 :(得分:4)

听起来你已经有模型工作和映射了吗?

但你只需要删除额外的导航属性吗?

如果你想删除导航属性,它很简单(尽管你不能做标准的EF设计师)。

您只需在XML编辑器中打开EDMX文件(在VS中很容易)并从客户实体中删除不需要的<NavigationProperty .../>

这种关系在模型中仍然存在,但在课堂上你只能来自 Store.TopCustomer

你不能走另一条路。

希望这有帮助

亚历

Microsoft的项目经理实体框架团队。