LINQ to SQL с корректной загрузкой классов карты

#c# #.net #linq #linq-to-sql #asp.net-mvc-2

#c# #.net #linq #linq-to-sql #asp.net-mvc-2

Вопрос:

это первый раз, когда я делаю это, когда я хочу добавить новый элемент в базу данных, это не удается.

Как установить свойство ArticleCategoryId в классе article для ссылки на категорию article в article, поскольку на данный момент оно равно null и не содержит никакого значения? Мои классы следующие:

Класс для статей:

 [Table(Name="Articles")]
public class Article
{        
    [HiddenInput(DisplayValue=false)]
    [Column(IsPrimaryKey=true, IsDbGenerated=true,AutoSync=AutoSync.OnInsert)]
    public int ArticleId { get; set; }

    [Column(Name="ArticleCategoryId", AutoSync = AutoSync.Never)]
    [Mapping.Association(IsForeignKey = true, Name = "FK_Articles_ArticleCategorys")]
    public ArticleCategories ArticleCategory{get;set;}

    [Column]
    public string Label { get; set; }

    [DataType(DataType.MultilineText)]
    [Column]
    public string Text { get; set; }

    [DataType(DataType.DateTime)]
    [Column]
    public DateTime Created { get; set; }
}
  

Класс для категорий:

 [Table(Name = "ArticleCategorys")]
public class ArticleCategories
{
    [HiddenInput(DisplayValue = false)]
    [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert, Name="ArticleCategoryId")]
    public int ArticleCategoryId { get; set; }

    [Column]
    public string Name { get; set; }        

    [Column]
    public string Description { get; set; }

    [DataType(DataType.DateTime)]
    [Column] public DateTime Created { get; set; }
}
  

Моя ошибка:

 [AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude = "ArticleId")] Article article)
{
    try
    {
        ArticleCategories category = articleCategoriesRepository.ArticleCategories.FirstOrDefault(x => x.ArticleCategoryId == article.ArticleCategory.ArticleCategoryId);
        article.ArticleCategory = category;
        article.Created = DateTime.Now;
        articlesRepository.SaveArticle(article);
        ViewData["Message"] = NudaJeFuc.WebUI.Properties.Resources.text_ArticleSaved;
        return RedirectToAction("Index");        
    }
    catch
    {
        return view();
    }
}
  

Ответ №1:

Я столкнулся с проблемой с сопоставлением Linq2SQL, когда оно не обновляется при добавлении новых столбцов в базу данных и, следовательно, завершается сбоем.

Поэтому мне пришлось бы удалять файл .edmx и повторно добавлять его каждый раз, когда я вносил изменения в базу данных.

Этого не происходит с ADO.NET Entity Framework, так что попробуйте, если сможете.

Комментарии:

1. я вообще не использую файл edmx, я сам написал это отображение

Ответ №2:

найдено решение, благодаря Стивену Сандерсону

 [Table(Name="Articles")]
public class Article
{        
    [HiddenInput(DisplayValue=false)]
    [Column(IsPrimaryKey=true, IsDbGenerated=true,AutoSync=AutoSync.OnInsert)]
    public int ArticleId { get; set; }

    [Column]
    internal int ArticleCategoryId { get; set; }

    internal EntityRef<ArticleCategories> _ArticleCategoryId;

    //[Column(AutoSync = AutoSync.OnInsert, Name = "ArticleCategoryId")]
    [Association(ThisKey="ArticleCategoryId", Storage="_ArticleCategoryId")]
    public ArticleCategories ArticleCategory
    {
        get
        {
            return _ArticleCategoryId.Entity;
        }
        set
        {
            ArticleCategoryId = value.ArticleCategoryId;
            _ArticleCategoryId.Entity = value;                
        }
    }

    [Column]
    public string Label { get; set; }

    [DataType(DataType.MultilineText)]
    [Column]
    public string Text { get; set; }

    [Required(ErrorMessage = "Musíte vybrat kategorii článku.")]
    [DataType(DataType.DateTime)]
    [Column]
    public DateTime Created { get; set; }
}
  

Комментарии:

1. Почему Стивен Сандерсон? Пожалуйста, обратитесь к источнику.

2. Потому что у него был пример в книге, которая у меня есть. Хотя я и не осознавал, что решение есть. ASP.NET mvc2