Adding additional properties to an entity framework 4 code first CTP 5 entity
Solution 1
You can ignore the type using Fluent API by adding an ignore rule to your OnModelCreating
method of your MyContext
class
public class MyContext : DbContext {
public DbSet<News> Newses { get; set; }
protected override void OnModelCreating(ModelBuilder builder) {
builder.Ignore<RuleViolation>()
}
}
Or you can ignore the property by using the NotMapped
attribute
public class Enitity {
[NotMapped]
public IList<RuleViolation> RuleViolations { get; set; }
//other properties here
}
and then Entity Framework will ignore the property.
Solution 2
You can also use:
[NotMapped]
public IList<RuleViolation> RuleViolations { get; set; }
To use NotMapped
you have to add using System.ComponentModel.DataAnnotations;
Edit:
Now I see that you want to avoid mapping property from base class. It doesn't work with OnModelCreating - it is confirmed bug in CTP5 (I will try to find link later). I'm not sure if it works with NotMappedAttribute. This attribute is just other approach to achieve the same result.
Brendan Vogt
Wedding photographer and videographer from Paarl, South Africa. Join me on my new adventure in wedding photography and videography at Brendan Vogt Photo & Video.
Updated on June 04, 2022Comments
-
Brendan Vogt almost 2 years
I am using
ASP.NET MVC 3
andEntity Framework code first CTP 5
. I was wondering if it is possible to add additional properties that is not mapped to a table column?I haved a News class and it is defined as such:
public class News : Entity { public int NewsId { get; set; } public string Title { get; set; } public string Body { get; set; } public bool Active { get; set; } }
My database context class:
public class MyContext : DbContext { public DbSet<News> Newses { get; set; } }
In the entity class I have a property defined like:
public IList<RuleViolation> RuleViolations { get; set; }
I have not code this part yet, but I want all broken rules to be added to this list when the object is validated. The error that I am getting is:
One or more validation errors were detected during model generation: System.Data.Edm.EdmEntityType: : EntityType 'RuleViolation' has no key defined. Define the key for this EntityType. System.Data.Edm.EdmEntitySet: EntityType: The EntitySet RuleViolations is based on type RuleViolation that has no keys defined.
Here is my reposity code:
public News FindById(int newsId) { return context.Database.SqlQuery<News>("News_FindById @NewsId", new SqlParameter("NewsId", newsId)).FirstOrDefault(); }
UPDATE 2011-03-02:
Here is my
Entity
class:public class Entity { public IList<RuleViolation> RuleViolations { get; set; } public bool Validate() { // Still needs to be coded bool isValid = true; return isValid; } }
Here is my
RuleViolation
class:public class RuleViolation { public RuleViolation(string parameterName, string errorMessage) { ParameterName = parameterName; ErrorMessage = errorMessage; } public string ParameterName { get; set; } public string ErrorMessage { get; set; } }
Here is my context class:
public class MyContext : DbContext { public DbSet<News> Newses { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<News>().Ignore(n => n.RuleViolations); } }
-
Brendan Vogt about 13 years@David: Thanks for the extended answer. Do I need to include base.OnModelCreating(modelBuilder);? If so, do I then need to include your code after or before this piece of code?
-
Brendan Vogt about 13 years@David: I'm still getting the same error. I've updated my original post, could you please have a look.
-
Brendan Vogt about 13 yearsI've decided to go with Dave's suggestion on using OnModelCreating. Why did you suggest use NotMapped instead of OnModelCreating? I'm still getting the error even though I did what Dave suggested. Could you please see my updated post.
-
David Glenn about 13 yearsTry
builder.Ignore<RuleViolation>();
orbuilder.Entity<Entity>().Ignore(x => x.RuleViolations);
instead. -
Brendan Vogt about 13 years@David: I tried modelBuilder.Ignore<RuleViolation>(); and it works now. Not sure if this is the correct way to do it? I would prefer Ignore, but apparently it is a bug.
-
Brendan Vogt about 13 yearsI used modelBuilder.Ignore<RuleViolation>(); and it works, but like I said I don't feel comfortable using it, I would prefer Ignore. I think for now I am going to exclude deriving from my Entity class and move the RuleViolations property to my News class, then the Ignore works perfectly. Just for now till the bug is fixed.
-
David Glenn about 13 yearsYour error was because Entity Framework was assuming
RuleViolation
was a complex type and trying to map it to aRuleViolations
database table that doesn't exist. UsingmodelBuilder.Ignore<RuleViolation>()
tells Entity Framework to ignore this type. It is perfectly acceptable to do it this way.