2016-06-29 13 views
1

必要ですEntity Frameworkのエラー:フィールド "ForeignKeyのが" EF

foreach (var rec in allRecs) 
{ 
    db.ExampleObject.Attach(rec); 
    rec.SomeValue = "TEST" 
} 

db.SaveChanges(); 

これはDbEntityValidationExceptionをスローを次のように私は、このエンティティを使用

public class ExampleObject 
{ 
    [Key] 
    public int ID { get; set; } 
    public int RelationID { get; set; } 
    public string SomeValue { get; set; } 

    [ForeignKey("RelationID")] 
    public virtual RelationObj RelationObj { get; set; } 
} 

その後、私のプロジェクトでは、次のように私は、エンティティを設定しています"フィールド" RelationObj "が必要です"

パフォーマンスに影響を与えるこれらのレコードを読み込むときにRelationObjを含めたくありません。なぜEFは外国関係オブジェクトをチェックするのに気をつけているのですか?これを修正するにはどうすればいいですか?

+0

。 db.Entry(rec).State = EntityState.Modified;このようにして、EFはオブジェクトのプロパティが変更されたことを知ります。 – Hakunamatata

+0

これは根本的な問題には対処しません。私は自分のデータを読み込むのが怠惰だし、私がする必要があるのは単純なレコードを更新するだけで、すべての関連オブジェクトを「インクルード」したくないということです。 – mrb398

+0

にはhttp://stackoverflow.com/questions/6038541/ef-validation-failing-on-update-when-using-lazy-loaded-required-propertiesの読み取りがあります。あなたがしたいことを光らせます。 – Hakunamatata

答えて

0

まずデシベル(Breaz)に変更、再び、次のテーブルを作成し、あなたのデシベル

USE [Breaz] 
GO 

/****** Object: Table [dbo].[Relation] Script Date: 6/29/2016 4:35:32 PM ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [dbo].[Relation](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [RelatedSomeValue] [varchar](10) NULL, 
CONSTRAINT [PK_Relation] PRIMARY KEY CLUSTERED 
(
    [ID] 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 

に一致するようにスクリプトの先頭にデータベースを変更、DBを作成します。

USE [Breaz] 
GO 

/****** Object: Table [dbo].[Example] Script Date: 6/29/2016 4:34:15 PM ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [dbo].[Example](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [RelationID] [int] NOT NULL, 
    [SomeValue] [varchar](10) NULL, 
CONSTRAINT [PK_Example] PRIMARY KEY CLUSTERED 
(
    [ID] 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].[Example] WITH CHECK ADD CONSTRAINT [FK_Example_Relation] FOREIGN KEY([RelationID]) 
REFERENCES [dbo].[Relation] ([ID]) 
GO 

ALTER TABLE [dbo].[Example] CHECK CONSTRAINT [FK_Example_Relation] 
GO 

追加します各テーブルには2行のデータが格納されています。

dbから新しい項目ADO.NETエンティティデータモデルを追加し、両方のテーブルを追加します。 edmxのExampleModelに名前を付けます。 Example.Context.csファイルから(BreazEntities7)コンテキスト(コンテキスト)を取得します。ここで

public class HomeController : Controller 
{ 
    public ActionResult YIndex() 
    { 
     using (BreazEntities7 db = new BreazEntities7()) 
     { 
      var allRecs = db.Examples; 
      foreach (var rec in allRecs) 
      { 
       rec.SomeValue = "TEST"; 
      } 
      db.SaveChanges(); 
     } 
     return View(); 
} 

が生成例です:

namespace Testy2.Models 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Example 
    { 
     public int ID { get; set; } 
     public int RelationID { get; set; } 
     public string SomeValue { get; set; } 

     public virtual Relation Relation { get; set; } 
    } 
} 
ここ

ID生成の関係:

あなたはEntityStateを指定する必要が
namespace Testy2.Models 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Relation 
    { 
     public Relation() 
     { 
      this.Examples = new HashSet<Example>(); 
     } 

     public int ID { get; set; } 
     public string RelatedSomeValue { get; set; } 

     public virtual ICollection<Example> Examples { get; set; } 
    } 
} 
関連する問題