2

저는 EF 및 코드 계약에서 초보자입니다. 프로젝트를 수행하기 위해 EF6 및 코드 계약을 사용합니다.엔티티 프레임 워크를 사용하는 C#에서 코드 계약 불변의 위반

DB 첫 번째 접근법에서 알다시피, EF는 DB 엔티티에 해당하는 클래스를 자동으로 생성하므로 수동으로 정의한 부분 클래스에 계약을 추가했습니다.

EF 생성 된 클래스 :

public partial class Article 
{ 
    public Article() 
    { 
     this.Comment = new HashSet<Comment>(); 
    } 

    public int articleId { get; set; } 
    public string title { get; set; } 
    public string contentText { get; set; } 
    public System.DateTime creationDate { get; set; } 
    public System.DateTime modificationDate { get; set; } 
    public int numOfVisits { get; set; } 
    public bool enabled { get; set; } 
    public int creatorId { get; set; } 
    public int categoryId { get; set; } 
    public string img { get; set; } 

    public virtual ICollection<Comment> Comment { get; set; } 
    public virtual Category Category { get; set; } 
    public virtual Administrator Administrator { get; set; } 
} 

수동으로 정의 된 클래스 :

public partial class Article 
{ 
    [ContractInvariantMethod] 
    private void ObjectInvariant() 
    { 
     Contract.Invariant(contentText != null); 
    } 

    public Article(string title, string img, int catid, string content) 
    { 
     Contract.Ensures(this.title.Equals(title)); 
     Contract.Ensures(this.img.Equals(img)); 
     Contract.Ensures(categoryId.Equals(catid)); 
     Contract.Ensures(Enumerable.SequenceEqual(Contract.OldValue(content), content)); 
     this.title = title; 
     this.img = img; 
     categoryId = catid; 
     contentText = content; 
     creationDate = DateTime.Now; 
     modificationDate = DateTime.Now; 
     numOfVisits = 0; 
     enabled = true; 
     DBConnection.addObject<Article>(this); 
    } 

    public Article editArticle(int id,string title, string img, int catid, string content) 
    { 
     using (var c = new SabaDataEntity()) 
     { 
      var art = c.Article.FirstOrDefault(i => i.articleId == id); 

      if(art != null) 
      { 
       art.title = title; 
       art.img = img; 
       art.categoryId = catid; 
       art.contentText = content; 
      } 

      c.SaveChanges(); 
      return art; 
     } 
    } 

    public Article deleteById(int id) 
    { 
     using (var c = new SabaDataEntity()) 
     { 
      var obj = c.Article.FirstOrDefault(i => i.articleId == id); 

      if (obj != null) 
      { 
       c.Article.Remove(obj); 
       c.SaveChanges(); 
       return obj; 
      } 

      return obj; 
     } 
    } 

    public List<Article> getAll() 
    { 
     using (var c = new SabaDataEntity()) 
     { 
      return c.Article.ToList(); 
     } 
    } 

    public string getCategoryName() 
    { 
     using (var c = new SabaDataEntity()) 
     { 
      var cat = c.Category.FirstOrDefault(i => i.categoryId == this.categoryId); 

      if (cat != null) 
       return cat.persianTitle; 

      return ""; 
     } 
    } 

    public Article get(int id) 
    { 
     using (var c = new SabaDataEntity()) 
     { 
      return c.Article.FirstOrDefault(i => i.articleId == id); 
     } 
    } 
} 

나는 불변의 위반 사실, 프로젝트에서이 클래스의 방법입니다 호출 할 때 발생한 문제 이 오류 :

불변 실패 : contentText! = null

이제 두 개의 생성자를 사용할 수 있습니까?

그리고 어떻게이 문제를 해결할 수 있습니까?

+1

,하지만 매우 중요에서

public class GenericRepository<T>: IDisposable where T : class { private SabaDataEntity db = null; private DbSet<T> table = null; static readonly GenericRepository<T> instance = new GenericRepository<T>(); public static readonly GenericRepository<T> Instance { get { return instance; } } public GenericRepository() { this.db = new SabaDataEntity(); table = db.Set<T>(); } public List<T> getAll() { return table.ToList(); } public T getById(int id) { return table.Find(id); } } 

는 : 구조와 같은 활성 레코드의이 종류를 사용하지 마십시오. 'Article'은 지속적이고 무지한 클래스 여야합니다. persistant-ignorant 클래스를 얻으려면 –

+0

EF를 사용하지 않아야합니다! 또는? –

+1

그는'Article'을 값에 대한 단순한 "보유자"로 만들고, 다른 클래스 (보통 DAO)로 검색/저장하는 로직을 작성하는 것을 의미합니다. – SJuan76

답변

1

EF를 사용하여 데이터 액세스를위한 다른 클래스를 리포지토리로 만들고 이러한 계약 오류를 피할 수 있습니다. 예컨대 : here

주제 오프
관련 문제