2016-09-09 3 views
0

Правильно ли этот код, чтобы добавить запись с отношением Id? Если я ввести идентификатор непосредственно, я получаю следующую ошибкуC# Entity framework - Добавить новую запись

Не удается неявно преобразовать тип «INT» в «Project.Models.Database.ArticleDatabase»

Является ли этот код ниже правильно?

var newArticle = new Articles(); 

newArticle.Artname = addarticle.Articlename; 

//NOT WORKING 
// newArticle.Artdatabase = addarticle.ArticlegroupId 

//WORKING, SEEMS WRONG 
newArticle.Artdatabase = _context.ArticleDatabase.SingleOrDefault(c => c.Id == addarticle.ArticlegroupId); 


newArticle.Articleaadddate = DateTime.Now; 
newArticle.Articlelastedit = DateTime.Now; 
newArticle.Artstatus = 3; 

_context.Articles.Add(newArticle); 
_context.SaveChanges(); 
+1

У вас нет свойства навигации в ArticleGroup? Потому что тогда вы можете просто получить нужную вам группу в качестве объекта и установить ее в свойстве newArticle.ArticleGroup, а EF будет обрабатывать остальные. – dutzu

+0

Код, который вы обозначили как WORKING, выглядит отлично. Свойство Artdatabase имеет тип «ArticleDatabase», поэтому вы можете назначать только что-то, что можно назначить «ArticleDatabase» - сначала вы пытаетесь установить его в Int (который не работает), но затем найдите ссылку на фактический экземпляр объект действительно работал ... что в этом плохого? –

+0

@Webruster он говорит, что с нерабочим кодом он получает исключение, заявляя, что тип - Project.Models.Database.ArticleDatabase –

ответ

2

// НЕ РАБОТАЕТ

// newArticle.Artdatabase = addarticle.ArticlegroupId

Это потому, что вы пытаетесь установить ArticlegroupId (который, как представляется, int) к собственности, которая, по-видимому, относится к типу ArticleDatabase.

Я предполагаю, что ваша модель выглядит примерно так:

public class Articles 
{ 
    public string Artname { get; set; } 

    [ForeignKey("ArtdatabaseId")] 
    public virtual ArticleDataBase Artdatabase { get; set; } 

    // For alternative 2 you'll need this. 
    public int ArtdatabaseId { get; set; } 
} 

Альтернатива 1. Используйте навигацию свойство. При использовании свойства навигации вам необходимо прикрепить его.

var newArticle = new Articles(); 

newArticle.Artname = addarticle.Articlename; 

// Create the entity and attach it. 
var artDataBase = new ArticleDataBase 
{ 
    Id = addarticle.ArticlegroupId 
}; 
_context.ArticleDatabase.Attach(artDataBase); 

newArticle.Artdatabase = artDataBase; 
newArticle.Articleaadddate = DateTime.Now; 
newArticle.Articlelastedit = DateTime.Now; 
newArticle.Artstatus = 3; 

_context.Articles.Add(newArticle); 
_context.SaveChanges(); 

Альтернатива 2. Использование внешнего ключа-свойство. При использовании этой опции вам необходимо явно указать внешний ключ в вашей модели.

var newArticle = new Articles(); 

newArticle.Artname = addarticle.Articlename; 
// Note that I'm using ArtdatabaseId and not Artdatabase. 
newArticle.ArtdatabaseId = addarticle.ArticlegroupId 

newArticle.Articleaadddate = DateTime.Now; 
newArticle.Articlelastedit = DateTime.Now; 
newArticle.Artstatus = 3; 

_context.Articles.Add(newArticle); 
_context.SaveChanges(); 

Взгляните на this article для определения внешних ключей с беглым вместо этого.

modelBuilder.Entity<Post>().HasRequired(p => p.Blog) 
       .WithMany(b => b.Posts) 
       .HasForeignKey(p => p.FKBlogId); 
Смежные вопросы