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
이제 두 개의 생성자를 사용할 수 있습니까?
그리고 어떻게이 문제를 해결할 수 있습니까?
,하지만 매우 중요에서
는 : 구조와 같은 활성 레코드의이 종류를 사용하지 마십시오. 'Article'은 지속적이고 무지한 클래스 여야합니다. persistant-ignorant 클래스를 얻으려면 –
EF를 사용하지 않아야합니다! 또는? –
그는'Article'을 값에 대한 단순한 "보유자"로 만들고, 다른 클래스 (보통 DAO)로 검색/저장하는 로직을 작성하는 것을 의미합니다. – SJuan76