2012-05-13 3 views
5

Tworzę bazę danych przy użyciu Microsoft Entity Framework i CodeFirst w języku C#. Chcę korzystać z bazy danych w aplikacji WPF, więc klasy jednostek powinny implementować "INotifyPropertyChanged".PostSharp wstawia k__Backing Field do klasy Entity, powodując niepowodzenie generowania baz danych

Można to zrobić bardzo elegancko za pomocą aspektu PostSharp, który wyzwala zdarzenie PropertyChanged automatycznie za każdym razem, gdy zmienia się właściwość. Gdybym stworzyć taki aspekt i używać go na moich zajęciach jednostki, pojawia się następujący exeption podczas próby utworzenia bazy danych:

\tSystem.Data.Entity.Edm.EdmNavigationProperty: Name: The specified name is not allowed:   '<Name>k__BackingField'. 

Oczywiście PostSharp tworzy właściwość o nazwie „k__BackingField”, co powoduje tworzenie bazy danych się nie powiedzie, ponieważ jest to nieprawidłowa nazwa z punktu widzenia EntityFramework. Czy istnieje sposób na obejście tego błędu bez ręcznego wdrażania "INotifyPropertyChanged" w każdej pojedynczej klasie jednostki?

P.S: Angielski nie jest moim ojczystym językiem, byłbym bardzo wdzięczny, gdybyś poinformował mnie o możliwych błędach w moich postach.

góry dziękuję

+0

k__Backingfield nie jest generowany przez bij postsharp, ale przez kompilator C#, gdy używasz automatycznie zaimplementowanej właściwości. – albertjan

+0

To może być prawda, ale jeśli wyłączę PostSharp, błąd już nie występuje. W jakiś sposób musi istnieć związek między błędem a PostSharp. – BoltzmannBrain

+0

Czy próbowałeś zmienić system z automatycznej implementacji na pole z zapleczem? – albertjan

Odpowiedz

6

To prawda, że ​​PostSharp można utworzyć właściwość o nazwie k__BackingField (prawdziwa nazwa jest nieco inna, co widzisz to nazwa ucieczki), bo przypuszczam, że jesteś stosujące aspekt pól, co powoduje, że PostSharp zamienia pola na właściwości o tej samej nazwie. Tak więc możesz mieć właściwość o nazwie po polu.

Powinieneś sprawdzić, czy naprawdę chcesz dodać aspekt do pola. Być może po prostu chciałeś dodać aspekt do właściwości, ale dodajesz go do pól przez pomyłkę. Domyślnie właściwości LocationInterceptionAspects są stosowane (multicast) dla pól o właściwościach i. Użyj MulticastAttributeUsageAttribute.AttributeTargets, aby ograniczyć go do właściwości.

+0

To faktycznie rozwiązało mój problem. Dziękuję Ci bardzo! – BoltzmannBrain

Powiązane problemy