首先使用实体​​框架数据库创建一对一关系

yan*_*yan 3 entity-framework one-to-one ef-code-first ef-database-first

EF Code First中,我们可以通过这样的编码来创建一对一的关系:

public class User
{
public int UserID {get;set;}
public string Name {get;set;}
public int UserDetailID {get;set;}

public UserDetail Detail {get;set;}
}

public class UserDetail
{
public int UserDetailID {get;set;}
public string Address {get;set:}
public int UserID {get;set;}

public User User {get;set;}

}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在Visual Studio 2012中首先使用EF数据库创建相同的关系时,我遇到了麻烦.这是我的代码:

CREATE TABLE [dbo].[Users] (
[UserID]                 UNIQUEIDENTIFIER CONSTRAINT [DF_Users_UserID] DEFAULT (newid()) NOT NULL,
[UserDetailID]                 UNIQUEIDENTIFIER NOT NULL,
[Name]                      NVARCHAR (50)    NOT NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([UserID] ASC),
CONSTRAINT [FK_Users_UserDetails] FOREIGN KEY ([UserDetailID]) REFERENCES [UserDetails]([UserDetailID])
);

CREATE TABLE [dbo].UserDetails] (
[UserDetailID]     UNIQUEIDENTIFIER CONSTRAINT [DF_UserDetails_UserDetailID] DEFAULT (newid()) NOT NULL,
[UserID]           UNIQUEIDENTIFIER NOT NULL,
[Address]             NVARCHAR(100) NOT NULL,
CONSTRAINT [PK_UserDetails] PRIMARY KEY CLUSTERED ([UserDetailID] ASC),
CONSTRAINT [FK_UserDetails_Users] FOREIGN KEY ([UserID]) REFERENCES [dbo].[Users] ([UserID])
Run Code Online (Sandbox Code Playgroud)

错误消息是这样的

"Error  2   SQL01767: Foreign key 'FK_Users_UserDetails' references invalid table 'UserDetails'.    
Run Code Online (Sandbox Code Playgroud)

我认为这个错误的原因可能是当它试图引用外键"UserDetailID"时,它发现它还没有被创建.但我不知道如何解决这个问题,我甚至不知道这是做这件事的方法,我知道与EF做一对一的关系很棘手,或者有些人甚至说这是不可能的.任何人都可以给我任何建议吗?谢谢.

更新:为了澄清我的情况,我试图在visual studio 2012数据库项目中设计数据库,然后将其发布到SQL服务器,之后,从SQL Server中的数据库创建/更新我的.edmx文件.我不确定如何创建一个EF可以正确识别的一对一关系,并在.edmx文件中创建正确的类.

Dav*_*ams 7

创建一个1:1的关系并不是那么棘手,当然也不是不可能,虽然这不是一个特别常见的要求,在这种情况下,我不明白为什么你会想要它?如果人们这么说,那么你就是在与错误的人交谈.

无论如何使用SQL查询似乎与EF无关,你只是直接使用数据库,在第一个CREATE中你试图添加约束但是你还没有创建另一个表... As你在问题中提到过.

我认为您需要先创建两个表,然后使用ALTER TABLE添加约束.

另外,搜索SO以获得1:1的问题会出现很多,所以我建议你这样做.

编辑:所以使用数据库项目(我只有VS Express所以我没有那些)你想用SQL创建一个"1:1"关系,然后将一个实体数据模型添加到一个(可能是不同的)项目中数据库并自动创建1:1的关系?

不幸的是,这是一个完全不同的故事.当我在谈论创建1:1的可能性时,仅参考EF,而不是数据库.你说在SQL中创建1:1实际上非常困难/不可能.我认为有意义的是,为了插入1:1的关系,您需要以完全相同的方式以某种方式插入到两个表中,或者在添加行时简单地禁用约束.

一般来说,有一些不同的选择.

  1. 不要不必要地拆分表.在真正的1:1中,所有数据都是必需的,因此分割的唯一原因是出于性能原因(例如分区),在这种情况下我会避免这种情况.

  2. 映射多个表到一个实体展示在这里.

  3. 创建1:0..1关系并在应用程序中强制执行您自己的要求.

在选项2或3中,您可以使用以下SQL创建一个关系,该关系在第二个表上使用与关系中的FK相同的PK.

CREATE TABLE [dbo].[Users] (
[UserID] UNIQUEIDENTIFIER CONSTRAINT [DF_Users_UserID] DEFAULT (newid()) NOT NULL,
[Name] NVARCHAR (50)    NOT NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([UserID] ASC),
);

CREATE TABLE [dbo].[UserDetails] (
[UserID]           UNIQUEIDENTIFIER NOT NULL,
[Address]             NVARCHAR(100) NOT NULL,
CONSTRAINT [PK_UserDetails] PRIMARY KEY CLUSTERED ([UserID] ASC),
CONSTRAINT [FK_UserDetails_Users] FOREIGN KEY ([UserID]) REFERENCES [dbo].[Users] ([UserID]) ON DELETE CASCADE 
);
Run Code Online (Sandbox Code Playgroud)

我建议你也尽可能使用商店生成的身份.