3

http://www.codeproject.com/Articles/206410/How-to-Configure-a-Self-Referencing-Entity-in-Codeに似た何かを達成しようとしていますが、私の場合、最初にコードを使用していません。db最初。このエラーが発生します{"PRIMARYKEY制約'pk_employee'の違反。オブジェクト'dbo.Employee'に重複するキーを挿入できません。\r\nステートメントが終了しました。"}。

        EmployeeEntity employeeEntity = null;
        EmployeeEntity employeeDelegate = null;

            // already EXISTS in table
            employeeDelegate = new EmployeeEntity
            {
                EMPL_UNO = 1,
                FULLNAME = "manager, name"
            };


        employeeEntity = new EmployeeEntity
        {
            EMPL_UNO = 2,
            FULLNAME = "employee, name",
            DELEGATE_EMPL_UNO = 1,
            Delegate = employeeDelegate
        };



MyContext.EmployeeEntities.Add(Employee);
    // throws error
MyContext.SaveChanges();

// テーブル

    CREATE TABLE [dbo].[Employee](
    [EMPL_UNO] [int] NOT NULL,
    [FULLNAME] [varchar](255) NULL,
    [DELEGATE_EMPL_UNO] [int] NULL,
 CONSTRAINT [pk_employee] PRIMARY KEY CLUSTERED 
(
    [EMPL_UNO] 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

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[Employee]  WITH CHECK ADD  CONSTRAINT [FK_Employee_Delegate] FOREIGN KEY([DELEGATE_EMPL_UNO])
REFERENCES [dbo].[Employee] ([EMPL_UNO])
GO

ALTER TABLE [dbo].[Employee] CHECK CONSTRAINT [FK_Employee_Delegate]
GO

// 実在物

  public partial class EmployeeEntity
{
    public EmployeeEntity()
    {
        this.SubOrdinates = new HashSet<EmployeeEntity>();
    }

    public int EMPL_UNO { get; set; }
    public string FULLNAME { get; set; }
    public Nullable<int> DELEGATE_EMPL_UNO { get; set; }

    public virtual ICollection<EmployeeEntity> SubOrdinates { get; set; }
    public virtual EmployeeEntity Delegate { get; set; }

}
4

1 に答える 1

3

メソッドがオブジェクトグラフからすべての不明なエンティティを挿入するため、コードは失敗Addします。この場合、最初のエンティティの存在についてコンテキストに通知しなかったため、新規および既存の従業員の両方がEFコンテキストに不明です(IDの設定だけでは不十分です) )。たとえば、次を使用できます。

var employeeDelegate  = new EmployeeEntity {
    EMPL_UNO = 1,
    FULLNAME = "manager, name"
};

MyContext.EmployeeEntities.Attach(employeeDelegate);

var employeeEntity = new EmployeeEntity {
    EMPL_UNO = 2,
    FULLNAME = "employee, name",
    DELEGATE_EMPL_UNO = 1,
    Delegate = employeeDelegate
};


MyContext.EmployeeEntities.Add(Employee);
MyContext.SaveChanges();

しかし、あなたの特定のケースでは、これもうまくいくはずです:

var employeeEntity = new EmployeeEntity {
    EMPL_UNO = 2,
    FULLNAME = "employee, name",
    DELEGATE_EMPL_UNO = 1 // Just set the FK, you don't need a reference if you don't want to modify the delegate as well
};

MyContext.EmployeeEntities.Add(Employee);
MyContext.SaveChanges();
于 2012-12-19T11:14:57.070 に答える