我在我的项目中使用Entity Framework 6.0代码第一种方法。我有几个如下定义的实体类
public class RequestTicket
{
public long Id {get;set;}
public string TicketNumber {get;set;}
public Contact OwnedBy {get;set;}
public long OwnedById {get;set;}
}
public class Contact
{
public long Id {get;set;}
public string name {get;set;}
}
public class RequestTicketRepository
{
private readonly EntityContext _context;
public RequestTicketRepository()
{
_context = new EntityContext();
}
public AddRequestTicket(RequestTicket newTicket)
{
_context.RequestTickets.Add(newTicket);
_context.SaveChanges();
}
}
此处RequestTicket
类的属性OwnedBy
是另一个类Contact
。
当我在存储库中使用AddRequestTicket
实例调用RequestTicket
方法并且其属性Contact
具有现有OwnedBy
对象时,它正在{{{}创建一个条目1}}表和RequestTicket
表中的一个条目。我没想到在Contact
中创建了一个条目,因为我传递了一个具有正确id的现有联系人对象。
有人可以告诉我,为避免创建联系人条目,我该怎么办?
答案 0 :(得分:0)
我使用您提供的代码创建了一个示例程序,但我没有看到您描述的问题。我能够添加一个联系人然后将其拉出并将其分配给新的RequestTicket。这不会导致创建另一个联系人...
class Program
{
static void Main(string[] args)
{
using (var entityContext = new EntityContext())
{
// get existing contact (let's assume we know it is ID 1)
var contact = entityContext.Contacts.Single(c => c.Id == 1);
// create a new RequestTicket and assign that contact to it
var rt = new RequestTicket {OwnedBy = contact, TicketNumber = "125"};
// add the request ticket
entityContext.RequestTickets.Add(rt);
// save
entityContext.SaveChanges();
}
}
}
虽然您没有包含它,但这里是您引用的EntityContext类:
public class EntityContext : DbContext
{
public IDbSet<RequestTicket> RequestTickets { get; set; }
public IDbSet<Contact> Contacts { get; set; }
}
请记住,没有充分的理由将DbContext的派生与另一个“Repository”对象包装起来。 IDbSet已经实现了存储库模式,因此您创建了一个不必要的抽象。
如果您想再提供有关问题的详细信息,请相应地修改您的帖子。
以下是数据库结构和数据的一些屏幕截图: