ASP.NETMVC4とEntityFramework5を使用しています。データベースの生成には、モデルファーストアプローチを使用しました。私のアプリケーションでは、実行中のログテーブルと靴のテーブルがあります。ユーザーは、実行中のログエントリに関連付けられた靴のペアを0または1つ持つことができます。だから、それは多くの関係にとって0..1のように思えます、そしてそれは私がモデルでそれを設定した方法です。context.SaveChanges()
靴が関連付けられていない新しいエントリを追加しようとすると、次のエラーが発生します。
The INSERT statement conflicted with the FOREIGN KEY constraint \"FK_ShoeLogEntry\".
ログエントリ用の靴を選ぶとすぐに問題なく動作します。では、ログエントリが靴のnull値を持つことができるように、関係を適切に設定するにはどうすればよいですか?以下のコードをここに貼り付けました:
新しいエントリを追加するために使用しているコード
le.ActivityType = ctx.ActivityTypes.Find(le.ActivityTypesId);
le.User = ctx.Users.Find(le.UserUserId);
le.Shoe = ctx.Shoes.Find(le.ShoeShoeId); //ShoeShoeId is null if nothing picked
ctx.LogEntries.Add(le);
ctx.SaveChanges();
ctx.Shoes.Find(le.ShoeShoeId)
nullが返されることを確認し、 le.Shoe
tonull
とle.ShoeShoeId
toに設定しようnull
としまし-1
たが、機能しませんでした。
以下に関連するコードを貼り付けようとしましたが、これは私にとってはかなり新しいことです。したがって、必要に応じてさらに追加できます。私は本当に助けに感謝します!
外部キーの設定
-- Creating foreign key on [ShoeShoeId] in table 'LogEntries'
ALTER TABLE [dbo].[LogEntries]
ADD CONSTRAINT [FK_ShoeLogEntry]
FOREIGN KEY ([ShoeShoeId])
REFERENCES [dbo].[Shoes]
([ShoeId])
ON DELETE NO ACTION ON UPDATE NO ACTION;
-- Creating non-clustered index for FOREIGN KEY 'FK_ShoeLogEntry'
CREATE INDEX [IX_FK_ShoeLogEntry]
ON [dbo].[LogEntries]
([ShoeShoeId]);
GO
主キーの設定
-- Creating primary key on [ShoeId] in table 'Shoes'
ALTER TABLE [dbo].[Shoes]
ADD CONSTRAINT [PK_Shoes]
PRIMARY KEY CLUSTERED ([ShoeId] ASC);
GO
-- Creating primary key on [LogId] in table 'LogEntries'
ALTER TABLE [dbo].[LogEntries]
ADD CONSTRAINT [PK_LogEntries]
PRIMARY KEY CLUSTERED ([LogId] ASC);
GO
モデルによって生成されたログエントリクラス
public partial class LogEntry
{
public int LogId { get; set; }
public string ActivityName { get; set; }
public System.DateTime StartTime { get; set; }
public string TimeZone { get; set; }
public int Duration { get; set; }
public decimal Distance { get; set; }
public Nullable<int> Calories { get; set; }
public string Description { get; set; }
public string Tags { get; set; }
public int UserUserId { get; set; }
public Nullable<int> ShoeShoeId { get; set; }
public int ActivityTypesId { get; set; }
public virtual User User { get; set; }
public virtual Shoe Shoe { get; set; }
public virtual ActivityTypes ActivityType { get; set; }
}
モデルによって生成された靴のクラス
public partial class Shoe
{
public Shoe()
{
this.ShoeDistance = 0m;
this.LogEntries = new HashSet<LogEntry>();
}
public int ShoeId { get; set; }
public string ShoeName { get; set; }
public decimal ShoeDistance { get; set; }
public int ShoeUserId { get; set; }
public string ShoeBrand { get; set; }
public string ShoeModel { get; set; }
public System.DateTime PurchaseDate { get; set; }
public int UserUserId { get; set; }
public virtual User User { get; set; }
public virtual ICollection<LogEntry> LogEntries { get; set; }
}