【问题标题】:How could you add an entity to two different parent entities using linq-to-sql or entity framework?如何使用 linq-to-sql 或实体框架将实体添加到两个不同的父实体?
【发布时间】:2013-09-27 19:37:12
【问题描述】:

是否可以将同一个实体添加到两个不同的实体而不复制子实体?奇怪的问题,我知道,但这就是我想用伪代码做的事情......

Transaction tran = new Transaction()

Task task = new Task();
task.Name = "My Task";

User user = new User();
user.Name = "John Smith";
user.Tasks.Add(task);

Document doc = new Document();
doc.Path = @"c:\temp\MyDoc.pdf";
doc.Tasks.Add(task);

tran.Users.Add(user);
tran.Documents.Add(doc);

tran.Create();

我希望开发人员能够将相同的任务对象添加到 User.Tasks 集合和 Document.Tasks 集合中,这样当我在 Create() 方法上插入数据库时​​,它通过 UserID 和 DocumentID 知道该任务与用户和文档相关。

任务表将具有每个 ID:

任务表

ID          int
UserID      int
DocumentID  int
etc...

【问题讨论】:

    标签: .net entity-framework linq-to-sql


    【解决方案1】:

    一个相当简单的模型可以做到这一点:

    public class Task
    {
      public int ID { get; set; }
      public string Name { get; set; }
      public Document Document { get; set; }
      public User User { get; set; }
    }
    
    public class User
    {
      public int ID { get; set; }
      public string Name { get; set; }
      public ICollection<Task> Tasks { get; set; }
    }
    
    public class Document
    {
      public int ID { get; set; }
      public string Path { get; set; }
      public ICollection<Task> Tasks { get; set; }
    }
    

    默认情况下,EF 会将外键列命名为 Document_IDUser_ID(带下划线)。如果您不希望这样,您可以告诉 EF 应该使用其他列名,例如像这样(在 DbContext 中):

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
      modelBuilder.Entity<Document>()
                  .HasMany(t => t.Tasks)
                  .WithOptional(t => t.Document)
                  .Map(m => m.MapKey("DocumentID"));
    }
    

    【讨论】:

    • 如果我先做数据库,并且关系映射到正确的 ID,我还需要 OnModelCreating 方法吗?
    • @RichC 否。edmx 包含模型。你不应该覆盖OnModelCreating。默认情况下,在数据库优先中,此覆盖包含throw new UnintentionalCodeFirstException();
    • 哇,我不相信你,所以我测试了它,它确实像你说的那样工作。大声笑谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    相关资源
    最近更新 更多