2

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.Shoetonullle.ShoeShoeIdtoに設定しよう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; }
}
4

1 に答える 1

8

0から多数が必要な場合は、外部キーがnull可能である必要があります。

public int? ShoeId { get; set; }

あなたは今それを持っているので、あなたはEFShoeIdにヌルにすることはできないと言ったので、あなたは1対多しか持っていません。

編集

申し訳ありませんが、間違ったクラスを見ていましたが、それを必要とする可能性のある他の人に任せます。ただし、ここでも状況はほとんど同じです。何が起こっているのかというと、FKネーミングのEF規則に従わないということです(ShoeShoeId)。のような仮想の場合Shoe、EFはプロパティを探しますShoeId。見つかった場合はFKフィールドになり、見つからなかった場合はEFがデータベースにFKのフィールドを自動的に追加します。Shoe_ShoeIdこの自動追加されたフィールドはnull許容ではなくなります。これが、ここで起こっていることです。

FKが存在することを主張する場合ShoeShoeIdは、これがFKであることをEFに明示的に伝えてShoeください。

[ForeignKey("Shoe")]
public int? ShoeShoeId { get; set; }
于 2013-03-25T19:49:08.267 に答える