I\'m new to ASP.NET MVC and EF hopefully this is not a silly question
When i pass model to view i\'m getting this error - Exception Details: System.Data.SqlC
In My Case I have added My Primary Key Relationship to Same Key .. SO I have simply remove..
In your ProfileVersion
and ServerInfo
entities you have an Environment
navigation property. By default, Entity Framework will try to create a database column called [Property Name]_[Referenced class PK]
. In your scenario, that's Environment_Id
. The problem, right now, is that you have not done a migration to have this database column created.
If I had to imagine what happened here, I'd say you first created the classes with EnvironmentId
properties, migrated, then later decided to add the navigation properties, Environment
to each, expecting EF to associate that with your existing EnvironmentId
properties. That's where you went wrong. As I said above, EF convention is to look for a database column named Environment_Id
, so if you want EF to use EnvironmentId
instead, you just need to tell it so with the ForeignKey
data annotation:
[ForeignKey("Environment")]
public int EnvironmentId { get; set; }
I realize this question is 3 years old now, but I saw a different reason for the error - both in the original question and in my own code that was pretty similar. And, in my case, I had the same error as stated above.
I had a "MY_ACTIONS" table with an ID and Name pair that I wanted to be added to a dropdown. Here's the model:
namespace TestSite.Models
{
public class MY_ACTIONS
{
//[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public MY_ACTIONS()
{
this.o_actions = new HashSet<MY_ACTIONS>();
}
[Key]
public int action_id { get; set; }
[StringLength(100)]
public string action_name { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<MY_ACTIONS> o_actions { get; set; }
}
}
And to get an action to display on the dropdown it had an ID set in an int
field called LASTACTION
in my main table. In that model I had declared the ForeignKey relationship:
namespace TestSite.Models
{
[Table("MAIN_TABLE")]
public partial class MAIN_TABLE
{
[Key]
public int MAIN_TABLE_ID { get; set; }
public int LASTACTION { get; set; } // this would carry a number matching action_id
[ForeignKey("LASTACTION")]
public virtual MY_ACTIONS MY_ACTIONS { get; set; }
}
}
I had the error Invalid column name 'MY_ACTIONS_action_id'
when loading this dropdown in my view:
@Html.DropDownList("lastaction", null, htmlAttributes: new { @class = "form-control" })
...for which I was using this ViewBag in my Controller function:
Model1 db = new Model1(); // database context
MAIN_TABLE o_main = new MAIN_TABLE();
o_main.lastaction = 2;
ViewBag.lastaction = new SelectList(db.MY_ACTIONS, "action_id", "action_name", o_main.lastaction);
If I did not have my FK relationship declared:
[ForeignKey("LASTACTION")]
public virtual MY_ACTIONS MY_ACTIONS { get; set; }
I probably also would've had the same issue. Having the representation of a virtual instance requires linking it with some physical property. This is similar to how this:
public virtual Environment Environment { get; set; }
Should be:
[ForeignKey("EnvironmentId")]
public virtual Environment Environment { get; set; }
in the ProfileVersion
class, in the question, above, assuming that EnvironmentId
is the Primary Key in a table called Environment
(that model is not shown above).
For me, though, I already had that and I was still getting the error, so doing that still might not solve everything.
Turns out all I had to do was get rid of that ICollection<MY_ACTIONS> o_actions
in the MY_ACTIONS
model and the this.o_actions = new HashSet<MY_ACTIONS>();
line and it all went through fine.
There are many such lists and ICollections
in play in the question above, so I would wager something is wrong with having them, as well. Start with just a plain model that represents the fields, then add in your virtual objects that represent tables linked to with foreign keys. Then you make sure your dropdown loads. Only after that should you start adding in your ICollections
, HashSets
, Lists<T>
and other such amenities that are not actually physically part of the database - this can throw off Entity Framework into thinking it needs to do something with them that it doesn't need to do.