0

現在、取り組んでいるプロジェクトで外部キーの問題が発生しています。Entity Code First を使用して DB を作成しています。これが私がこれまでに持っているものです。

テーブル

単位: ID, ...

カテゴリー: ID, ...

CategoryUnits: Id、CategoryId、UnitId

コードファースト

カテゴリ.cs

public partial class Category : BaseEntity, ILocalizedEntity
{
    private ICollection<CategoryUnits> _categoryUnits;

    ...

    public virtual ICollection<CategoryUnits> CategoryUnits
    {
        get { return _categoryUnits ?? (_categoryUnits = new List<CategoryUnits>()); }
        protected set { _categoryUnits = value; }
    }
}

Units.cs

public class Units : BaseEntity
{
    ...
}

CategoryUnits.cs

public partial class CategoryUnits : BaseEntity, ILocalizedEntity
{
    public virtual int UnitId { get; set; }
    public virtual int CategoryId { get; set; }

    public virtual Units Unit { get; set; }
    public virtual Category Category { get; set; }
}

CategoryUnitsMap.cs

public partial class CategoryUnitsMap : EntityTypeConfiguration<CategoryUnits>
{
    public CategoryUnitsMap()
    {
        this.ToTable("CategoryUnits");
        this.HasKey(cu => cu.Id);

        this.HasRequired(cu => cu.Unit)
            .WithMany()
            .HasForeignKey(cu => cu.UnitId);

        this.HasRequired(cu => cu.Category)
            .WithMany(c => c.CategoryUnits)
            .HasForeignKey(cu => cu.CategoryId);
    }
}

現在、データ移行プログラム中にデータを挿入しようとすると、次のメッセージが表示されます。

INSERT ステートメントが FOREIGN KEY 制約 "CategoryUnits_Category" と競合しました。データベース「NopDB3」、テーブル「dbo.Category」、列「Id」で競合が発生しました。

これは、実際にテーブルにデータを入れているコードです。

Program.cs

private static void AddDefaultOfficeSuppliesUnitRights()
    {
        try
        {
            var unitIds = new List<int>();
            var sqlSelectStatement = "Select * From Units With(NoLock)";
            var units = new DataSet();

            using (var sqlCommand = new SqlCommand(sqlSelectStatement, sqlCon))
            {
                var sqlAdapter = new SqlDataAdapter();
                sqlAdapter.SelectCommand = sqlCommand;
                sqlCon.Open();
                sqlAdapter.Fill(units);
                sqlCon.Close();
            }

            foreach (DataRow dr in units.Tables[0].Rows)
            {
                var unitId = Int32.Parse(dr["Id"].ToString());
                unitIds.Add(unitId);
            }

            var sqlInsertStatement = GenerateCategoryUnitsForOfficeSupplies("Insert Into CategoryUnits (UnitId, CategoryId) Values (cuUnitId, 19)", unitIds);
            using (var sqlCommand = new SqlCommand(sqlInsertStatement, sqlCon))
            {
                sqlCon.Open();
                sqlCommand.ExecuteNonQuery();
                sqlCon.Close();
            }

            Console.WriteLine("Default Office Supply CategoryUnits Added");
        }
        //Something went wrong
        catch (Exception ex)
        {
            Console.WriteLine("Error in Add Default Category Units for Office Supplies: " + ex.Message);
        }
        //Close out sql connection
        finally
        {
            if (sqlCon.State != ConnectionState.Closed) sqlCon.Close();
        }
    }

private static string GenerateCategoryUnitsForOfficeSupplies(string sqlInsertStatement, List<int> unitIds)
    {
        var sqlInsertStatements = string.Empty;
        foreach (var unitId in unitIds)
        {
            sqlInsertStatements += sqlInsertStatement.Replace("cuUnitId", unitId.ToString()) + "; ";
        }

        return sqlInsertStatements;
    }

これについて最も奇妙なことは、SQL ステートメントでデータを手動で挿入すると、正常に動作し、エラーが発生しないことです。どんな提案も役に立ちます。

4

0 に答える 0