【问题标题】:Handling default values for models in EF4处理 EF4 中模型的默认值
【发布时间】:2012-08-01 00:35:22
【问题描述】:

我想知道在制作模型时处理关系默认值的最佳方法是什么。 (特别是 EF4)

例如,我的组织有一个默认联系人,我想知道哪个是最好的方法。我有这两个选项(或任何其他人建议如果更好)

使用关系:

public  class Contact
{
    public int Id { get; set; }
    public string FirstName { get; set; }
}

public  class Organization
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Contact> Contacts { get; set; }
    //Use a relationship for the default contact?
    public Contact DefaultContact { get; set; }
}

使用价值:

public  class Contact
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    //Use value?
    public boolean IsDefault { get; set; }
}

public  class Organization
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Contact> Contacts { get; set; }
}

【问题讨论】:

  • 为了降低复杂性,我会选择选项 2。并不是第一个选项过于复杂,但拥有 bool 属性似乎比自定义类型属性更直接且更易于管理
  • 这个问题首先远远超出了 EF 4 模型甚至 OR/M,因为它对任何 OR/M 甚至数据库级别都有影响。考虑到这一点,我会考虑编辑这个问题,它将覆盖更广泛的受众。
  • 我同意,但由于具体技术是 EF,我会保留这些标签,以了解其他人在使用相同工具之前如何解决这种情况。 Tnx 马克。

标签: asp.net visual-studio-2010 oop orm entity-framework-4


【解决方案1】:

我会选择选项 1。虽然 2 肯定更容易实现,但它不会强制执行诸如“不能有 2 个默认联系人”之类的规则。我最终得到如下内容:

public class Organization {
    // ...
    public virtual ICollection<Contact> { get;set; }
    [ForeignKey("DefaultContactId")]
    public Contact DefaultContact { get;set; }
    public int? DefaultContactId { get;set; }
}

这种方法有一个限制 - 它不适用于嵌套删除(有关更多详细信息,请参阅this question)。因此,您需要为一对多关系禁用 CascadeOnDelete:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Contact>().HasRequired(co => co.Organization).WithMany().WillCascadeOnDelete(false);
}

(代码在没有测试的情况下完成,但应该可以工作)

另一个问题是在添加组织的同时添加默认联系人是不可能的,因为 EF 无法确定语句的正确顺序。您需要在每个之间调用 .SaveChanges。你仍然可以使用 TransactionScope 来克服这个问题,但它并不干净:

using (var ts = new TransactionScope()) 
{
    Organization org = new Organization
    {
        // ...
        Contacts = new Collection<Contact>()
    }
    org.Contacts = new Contact() {};

    orgRepo.SaveChanges();

    // Now wire up the default contact
    org.DefaultContact = org.Contacts.First();
    orgRepo.SaveChanges();
}

【讨论】:

  • AWESOMESAURUS Richard,非常感谢你,我会采用这种方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2015-12-31
相关资源
最近更新 更多