Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Failing to find Key attribute on the property if the property name in the model not equal to "Id" #32

Open
srnux opened this issue Dec 11, 2012 · 11 comments
Labels

Comments

@srnux
Copy link

srnux commented Dec 11, 2012

Model pseudo-code:
[Key]
public long AnythingDifferentFromId { get; set; }

Breaks at line 49, ViewHelperExtensions.cs :
return model.GetType().GetProperty(model.IdentifierPropertyName()).GetValue(model,new object[0]);
with exception:
Object reference not set to an instance of an object.

Cause, line ~60:
if (type.GetProperties().Any(info => info.PropertyType.AttributeExists<System.ComponentModel.DataAnnotations.KeyAttribute>()))
does not find the Key

Possible solution, replace the if inside IdentifierPropertyName with:
if (type.GetProperties().Any(info => info.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.KeyAttribute), true)!=null))
{
return
type.GetProperties().First(info => info.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.KeyAttribute), true)!=null).Name;
}

@erichexter
Copy link
Owner

can you provide a pull request or a failing unit test?

Eric Hexter

blog | http://Hex.LosTechies.com
info | http://www.linkedin.com/in/erichexter

On Tue, Dec 11, 2012 at 4:32 AM, srnux notifications@github.com wrote:

Model pseudo-code:
[Key]
public long AnythingDifferentFromId { get; set; }

Breaks at line 49, ViewHelperExtensions.cs :
return
model.GetType().GetProperty(model.IdentifierPropertyName()).GetValue(model,new
object[0]);
with exception:
Object reference not set to an instance of an object.

Cause, line ~60:
if (type.GetProperties().Any(info => info.PropertyType.AttributeExists()))
does not find the Key

Possible solution, replace the if inside IdentifierPropertyName with:
if (type.GetProperties().Any(info =>
info.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.KeyAttribute),
true)!=null))
{
return
type.GetProperties().First(info =>
info.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.KeyAttribute),
true)!=null).Name;
}


Reply to this email directly or view it on GitHubhttps://github.com//issues/32.

@srnux
Copy link
Author

srnux commented Dec 22, 2012

I will try to provide the unit test as soon I get to my development machine.

Thanks,
Luka

2012/12/22 Eric Hexter notifications@github.com

can you provide a pull request or a failing unit test?

Eric Hexter

blog | http://Hex.LosTechies.com
info | http://www.linkedin.com/in/erichexter

On Tue, Dec 11, 2012 at 4:32 AM, srnux notifications@github.com wrote:

Model pseudo-code:
[Key]
public long AnythingDifferentFromId { get; set; }

Breaks at line 49, ViewHelperExtensions.cs :
return

model.GetType().GetProperty(model.IdentifierPropertyName()).GetValue(model,new

object[0]);
with exception:
Object reference not set to an instance of an object.

Cause, line ~60:
if (type.GetProperties().Any(info =>
info.PropertyType.AttributeExists()))
does not find the Key

Possible solution, replace the if inside IdentifierPropertyName with:
if (type.GetProperties().Any(info =>

info.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.KeyAttribute),

true)!=null))
{
return
type.GetProperties().First(info =>

info.GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.KeyAttribute),

true)!=null).Name;
}


Reply to this email directly or view it on GitHub<
https://github.com/erichexter/twitter.bootstrap.mvc/issues/32>.


Reply to this email directly or view it on GitHubhttps://github.com//issues/32#issuecomment-11640702.

@srnux
Copy link
Author

srnux commented Dec 24, 2012

Please find the unit tests inside a test project here:

https://github.com/srnux/MVCTwitterBootstrap

Luka

@erichexter
Copy link
Owner

awesome.. i will add a project and unit tests in the for this extension
code and add the appropriate code to support the key attribute

Eric Hexter

blog | http://Hex.LosTechies.com
info | http://www.linkedin.com/in/erichexter

On Mon, Dec 24, 2012 at 5:15 AM, srnux notifications@github.com wrote:

Please find the unit tests inside a test project here:

https://github.com/srnux/MVCTwitterBootstrap

Luka


Reply to this email directly or view it on GitHubhttps://github.com//issues/32#issuecomment-11658895.

@xkobram
Copy link

xkobram commented Jan 6, 2013

I have another resolution (more like a quickfix) for this bug: change ... info.PropertyType.AttributeExists ... to info.AttributeExists ... on lines 66 and 70.

The problem is that info.PropertyType points to the type of the property (ie String) so it can't have the KeyAttribute. but info.AttributeExists asks about the attributes of the actual property.

@starcub
Copy link

starcub commented Jun 2, 2013

@xkobram 's post should fix the issue.

@gomifromparis
Copy link

Just to confirm I had the problem with a key attribute on a string, xkobram's solution fixed it.

@eljeanc
Copy link

eljeanc commented Jul 20, 2013

Im having the same problem described but in muy situtation we are using fluent api so we do not add the key data annotation in the class or the ID to the key in the object. What can i do ?

I would appreciate any help.

@erichexter
Copy link
Owner

You can change that method to find your id field by your convention.

On Saturday, July 20, 2013, eljeanc wrote:

Im having the same problem described but in muy situtation we are using
fluent api so we do not add the key data annotation in the class or the ID
to the key in the object. What can i do ?

I would appreciate any help.


Reply to this email directly or view it on GitHubhttps://github.com//issues/32#issuecomment-21297540
.

Eric Hexter

blog | http://Hex.LosTechies.com
info | http://www.linkedin.com/in/erichexter

@eljeanc
Copy link

eljeanc commented Jul 20, 2013

any idea on how to achieve this i have been thinking how to make it work without using the data annotations, this because our project will not use it directly in de dtos.

@erichexter
Copy link
Owner

If you name your properties Id or key or some other predictable way you
can do it that way, the views support the name id now. That is how I use it

On Saturday, July 20, 2013, eljeanc wrote:

any idea on how to achieve this i have been thinking how to make it work
without using the data annotations, this because our project will not use
it directly in de dtos.


Reply to this email directly or view it on GitHubhttps://github.com//issues/32#issuecomment-21297958
.

Eric Hexter

blog | http://Hex.LosTechies.com
info | http://www.linkedin.com/in/erichexter

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

6 participants