2014-06-17 1 views
0

Я хочу сначала использовать Entity Framework для создания внешнего ключа путем ссылки на первичный ключ той же таблицы. Пожалуйста, запустите SQL, чтобы понять это требование, хотя позвольте мне лучше всего это выразить.Entity Framework создает внешний ключ, ссылаясь на первичный ключ той же таблицы

У меня есть User класса/модель, которая имеет свойство UserId (первичный ключ), теперь я хочу иметь еще два свойства CreatedBy и UpdatedBy как в качестве внешнего ключа UserId для одной и той же User таблицы

Таблица структуры

UserID(PK,int,not null) 
FirstName 
LastName 
UpdatedBy 
CreatedBy(FK,int,not null) -- FK to UserId 
UpdatedBy(FK,int, not null) -- FK to UserId 

SQL для справки

CREATE TABLE [dbo].[User] 
(
    [UserId] [int] IDENTITY(1,1) NOT NULL, 
    [FirstName] [nvarchar](50) NOT NULL, 
    [LastName] [nvarchar](50) NOT NULL, 
    [Email] [nvarchar](50) NOT NULL, 
    [CreatedBy] [int] NULL, 
    [UpdatedBy] [int] NULL, 

    CONSTRAINT [PK_tbl_User] PRIMARY KEY CLUSTERED ([UserId] ASC) 
) ON [PRIMARY] 
GO 

ALTER TABLE [dbo].[User] WITH NOCHECK 
ADD CONSTRAINT [FK_tbl_User_CreatedBy] 
FOREIGN KEY([CreatedBy]) REFERENCES [dbo].[User] ([UserId]) 
GO 

ALTER TABLE [dbo].[User] CHECK CONSTRAINT [FK_tbl_User_CreatedBy] 
GO 

ALTER TABLE [dbo].[User] WITH NOCHECK 
ADD CONSTRAINT [FK_tbl_User_UpdatedBy] 
FOREIGN KEY([UpdatedBy]) REFERENCES [dbo].[User] ([UserId]) 
GO 

ALTER TABLE [dbo].[User] CHECK CONSTRAINT [FK_tbl_User_UpdatedBy] 
GO 
+0

Итак, в чем проблема, с которой вы столкнулись? – hoekki

+0

Я бы сделал CreateBy и UpdateBy нулевым, так как вы можете попасть в troulbe с настройкой CreatedBy для первого пользователя. ОбновленныйBy также может быть нулевым, если обновлений еще нет. Не может указывать на одного и того же пользователя с неопределяемым ограничением. – hoekki

+0

Покажите нам свой существующий код. – Yorro

ответ

0

Я подозреваю, что ваша проблема связана с внешними ключами, не имеющими нулевых значений.

Вы не сможете добавить нового пользователя без создания другого пользователя. Итак, как вставить первого пользователя?

Удаление пользователя кажется сложным. Ссылки на внешние ключи либо должны быть установлены как null или каскадное удаление. Null не является опцией, так как поле ссылки помечено как «не null». Таким образом, команда delete будет каскадироваться, теоретически удаляя все записи из таблицы, в конце концов. До первого пользователя, который не может быть удален, так как нет пользователя, создавшего первого пользователя.

Никакая СУБД не должна/должна допускать создание такой базы данных.

public class User { 

    public int UserId {get; set;} 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
    public Nullable<int> CreatedByRef {get; set;} 
    public Nullable<int> UpdatedByRef {get; set;} 

    public virtual User CreatedBy {get; set;} 
    public virtual User UpdatedBy {get; set;} 

} 

public class UserMap : EntityTypeConfiguration<User> { 

    public UserMap() { 

     ToTable("Users"); 

     HasKey(t=>t.UserId); 

     HasOptional(t=>t.CreatedBy).WithMany().HasForeignKey(t=>t.CreatedByRef); 
     HasOptional(t=>t.UpdatedBy).WithMany().HasForeignKey(t=>t.UpdatedByRef); 

    } 

}