Entity Framework: Set Delete Rule with CodeFirst -


i using ef4 ctp 5, codefirst.

please see classes first:

public class guest {         [key]         public guid guestid { get; set; }          public language preferredlanguage { get; set; }         public guid? languageid { get; set; } }  public class language {         [key]         public guid languageid { get; set; }          [required(errormessage = "enter language name")]         [stringlength(50, errormessage = "language name long")]         public string languagename { get; set; } // in origine language } 

my goal set "delete rule" guest-language relationship. when language deleted, do not want delete corresponding guests (so no cascade delete). instead want guest's languageid "set null".

i hoping fluent api support me here. couldn't find helpful besides .willcascadeondelete(bool), not provide options need. did miss anything? or not implemented in ctp 5?

thanks help!

what looking can achieved setting optional association between guest , language entities:

protected override void onmodelcreating(modelbuilder modelbuilder) {     modelbuilder.entity<guest>()                 .hasoptional(p => p.preferredlanguage)                 .withmany()                 .hasforeignkey(p => p.languageid); } 

unit test:

using (var context = new context()) {     var language = new language()     {         languagename = "en"     };     var guest = new guest()     {         preferredlanguage = language     };     context.guests.add(guest);     context.savechanges();      context.languages.remove(language);     context.savechanges(); } 

as result, we'll end having guest record db null value languageid fk column.


update:

first let's see why above unit test succeeded looking sql profiler. below shows trace right after calling second savechanges() method:

enter image description here enter image description here

so can see, ef smart enough first update guest record setting languageid null , submit delete statement remove language record default ef behavior when set optional association. has been taken care of on application side ef , of course you'll error dbms if try manually delete language record inside sql server mentioned.

however, there more story. consider following unit test:

using (var context = new context()) {     var language = new language() { languagename = "en" };     var guest = new guest() { preferredlanguage = language };     context.guests.add(guest);     context.savechanges(); }  using (var context = new context()) {     var language = context.languages.first();             context.languages.remove(language);     context.savechanges(); }      

this 1 fails throwing sqlexception contains exact message got sql server while trying manually delete record. reason because in second unit test no have related guest object loaded in context ef not aware of , won't submit necessary update statement did in first example.

back question, unfortunately ef code first not allow explicitly changing delete/update rule on relationships can resort sqlcommand method see example of in this post. in case, can code:

protected override void seed(context context) {     context.database.sqlcommand("alter table dbo.guests drop constraint guest_preferredlanguage");     context.database.sqlcommand("alter table dbo.guests add constraint guest_preferredlanguage foreign key (languageid) references dbo.languages(languageid) on update no action on delete set null"); } 

which looking for. having above seed method in place, second unit test pass.

hope helps,
morteza


Comments

Popular posts from this blog

apache - Add omitted ? to URLs -

redirect - bbPress Forum - rewrite to wwww.mysite prohibits login -

php - How can I stop spam on my custom forum/blog? -