Я начал изучать сущность CTP5, написав приложение для Windows.
у меня есть две модели (единица и товар) следующим образом:
public class Unit : BaseEntity
{
public Unit()
{
Goods = new List<Good>();
}
public string name { get; set; }
public virtual ICollection<Good> Goods { get; set; }
}
public class Good : BaseEntity
{
public Int64 code { get; set; }
public string name { get; set; }
public virtual Unit Unit { get; set; }
}
Я использую интерфейс хранилища с именем IRepository, как показано ниже:
public interface IRepository
{
BaseEntity GetFirst();
BaseEntity GetNext(Int32 id);
BaseEntity GetPrevoius(Int32 id);
BaseEntity GetLast();
BaseEntity GetById(Int32 id);
void Update(int id, BaseEntity newEntity);
void Delete(int id);
void Insert(BaseEntity entity);
int GetMaxId();
IList GetAll();
}
каждая модель имеет свой собственный репозиторий, но, возможно, лучше использовать универсальный репозиторий типа BaseEntity. Ссылка на GoodRepository выполняется в GoodForm, а соответствующий объект типа Good создается объектом Activator в таких общих методах, как Insert / Update / Delete ..., как показано ниже:
private void InsertButton_Click(object sender, EventArgs e)
{
Unit unit = goodRepo.GetUnitById(Convert.ToInt32(UnitIdTextBox.Text));
if (unit == null)
{
unit = new Unit { Id = goodRepo.GetUnitMaxId(), Name = "Gram" };
}
var good = Activator.CreateInstance<Good>();
good.Id = string.IsNullOrEmpty(IdTextBox.Text) ? goodRepo.GetMaxId() : Convert.ToInt32(IdTextBox.Text);
IdTextBox.Text = good.Id.ToString();
good.Name = NameTextBox.Text;
good.Description = DescriptionTextBox.Text;
good.Unit = unit;
goodRepo.Insert(good);
}
и метод GoodRepository.Insert:
public void Insert(Model.BaseEntity entity)
{
using (PlanningContext context = new PlanningContext())
{
context.Goods.Add(entity as Good);
int recordsAffected = context.SaveChanges();
MessageBox.Show("Inserted " + recordsAffected + " entities to the database");
}
}
Моя проблема заключается в том, что SaveChanges () генерирует ошибку «Нарушение ограничения PRIMARY KEY» и говорит, что не может вставить дубликат ключа в объект «dbo.Units».
но если я перенесу свой контекст в форму, в которой я создаю Хороший объект, и вставлю его туда, то все в порядке.
Кто-нибудь может подсказать мне, как решить эту проблему?
заранее благодарю