現在、取り組んでいるプロジェクトで外部キーの問題が発生しています。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 ステートメントでデータを手動で挿入すると、正常に動作し、エラーが発生しないことです。どんな提案も役に立ちます。