2016-10-14 1 views
0

は、私は次のエンティティがあるとします。エンティティフレームワークLINQツーエンティティのエントリを更新するために条件を追加する方法

public class Library 
{ 
    public int ID { get; set; } 

    public ICollection<Book> Books { get; set; } 

    public Library() 
    { 
     Books = new HashSet<Book>(); 
    } 
} 
public class Book 
{ 
    public int ID { get; set; } 
    public int LibraryID { get; set; } 
    public string Title { get; set; } 
    public string Author { get; set; } 
    public DateTime PublicationDate { get; set; } 
    public bool CheckedOut { get; set; } 
} 

は、ライブラリの束があり、各図書館は本の束を持っています。 ID = 1のライブラリの誰かがID = 42の本をチェックするので、CheckedOutプロパティをtrueに更新します。どのような理由であれ、私はすでに図書館のIDと本のIDを知っていますが、他の情報は知っていません。私は、データベースからすべての書籍データをフェッチすることなく、比較的簡単にちょうどCheckedOutプロパティを更新することができます。

Book book=new Book(){ 
    ID=42, 
    LibraryID=1, 
    CheckedOut=true 
} 
context.Books.Attach(book); 
var entry=context.Entry(book); 
entry.Property(b=>b.CheckedOut).IsModified=true; 
context.SaveChanges(); 

ここに私の質問です。この書籍でデータベースのLibraryID1でない場合、どのようにして強制的に失敗させることができますか?単純なSQLで書くことができる

UPDATE Books SET CheckedOut=1 WHERE ID=42 AND LibraryID=1 

エンティティフレームワークで同じことをするにはどうすればよいですか?あなたは、例えば、ユーザが、あなたが.Attach(book)を使用する場合1.

答えて

2

以外の任意のライブラリからブックをチェックアウトする権限を持っていない場合 - ここ

明白なユースケースは、複数のセキュリティを追加することです実際にEFに伝えています。ちょっと、これらはオリジナルののデータベースの既存レコードの値です。あなたのケースでは、EFは既存のbook.LibraryID1であると考えます。あなたはその事実を利用してデータ注釈のいずれかによってOptimistic Concurrency Tokenとして使用されるようにLibraryIDプロパティを設定することで、必要なチェックを実行するためにEFを強制することができます。

public class Book 
{ 
    // ... 
    [ConcurrencyCheck] 
    public int LibraryID { get; set; } 
} 

または流暢API:

​​

今、あなたがオンにした場合上のEFロギング、あなたが、あなたはこのような何かを参照してくださいよ、スニペットを実行します。

14/10/2016午前21時35分32秒03で

オープンな接続:00

UPDATE [dbo].[Books] 
SET [CheckedOut] = @0 
WHERE (([ID] = @1) AND ([LibraryID] = @2)) 

-- @0: 'True' (Type = Boolean) 

-- @1: '42' (Type = Int32) 

-- @2: '1' (Type = Int32) 

あなたの後ろに似ています。

このアプローチの唯一の潜在的な問題は、が1ではない場合にDbUpdateConcurrencyExceptionになることです。

関連する問題